[groonga-dev,03400] Re: PostgreSQLとgroongaのレコードの紐付けにctidを使うのは大丈夫なのでしょうか?

Back to archive index

Hiroaki Nakamura hnaka****@gmail*****
2015年 8月 11日 (火) 22:39:33 JST


2015年8月11日 20:42 Kouhei Sutou <kou****@clear*****>:

> 須藤です。
>
> In <CAN-DUMTjMec-WM9Fmo4k7f=o45ud****@mail*****>
>   "[groonga-dev,03397] PostgreSQLとgroongaのレコードの紐付けにctidを使うのは大丈夫なのでしょうか?"
> on Tue, 11 Aug 2015 11:41:54 +0900,
>   Hiroaki Nakamura <hnaka****@gmail*****> wrote:
>


> > この説明を読む限り、ctidをgroongaのテーブルに保存しておいてPostgreSQL
> > のレコードとの紐付けに
> > 使うのは良くないような気がします。
>
> このドキュメントを読むとそう思いますよねぇ。
>
> ですが、これで大丈夫なんです。
> これはSQLで使う場合の話で、拡張機能としてインデックスを実装
> する場合はそんなことはないんです。
>
> というか、インデックスはctidを返すことを求められるので、ctid
> を保存しておかないと適切な結果を返すことはできません。
>

なるほど、そうなんですか。

確かに
http://www.postgresql.org/docs/current/static/index-functions.html
を見るとamgettupleやamgetbitmapのところにtuple IDを返すような記述がありますね。

PGroongaのコードだとこの辺りでctidを返しているんですね。
https://github.com/pgroonga/pgroonga/blob/4658a7b26eb2db17f655c4c805902a94c12651d2/pgroonga.c#L2425
https://github.com/pgroonga/pgroonga/blob/4658a7b26eb2db17f655c4c805902a94c12651d2/pgroonga.c#L2455
https://github.com/pgroonga/pgroonga/blob/4658a7b26eb2db17f655c4c805902a94c12651d2/pgroonga.c#L2468



> VACUUM FULLしたときも大丈夫なのかは試さないとわからないんで
> すが、GINもctidを格納しているように見えるので大丈夫じゃない
> かなぁと思っています。
>
> 念のため試してみるか!という気持ちになったら結果を教えてもら
> えるとうれしいです。
>

https://github.com/pgroonga/pgroonga/blob/6d3600c12c5abda068facebacc44751eecd48eb9/README.md
memosのテーブルでinsertしたあと一部のレコードをdeleteして再度insertした状態でvacuum fullを試してみました。

https://github.com/hnakamur/pgroonga/commit/c3c133e40773062de47600b581bd848435cf6732
で自作したpgroonga.ctid()という関数で
select id, pgroonga.ctid(memos) from memos;
で確認するとctidはvacuum full前後で変更され、とびとびの番号だったのが1からの連番になっていました。

一方
select pgroonga.table_name('pgroonga_content_index');
を実行するとGroongaのテーブル名も変更されていました。
select oid from pg_catalog.pg_database where datname = 'データベース名';
でDBのoidを調べ、
groonga ${PostgreSQLのDBディレクトリ}/base/${DBのoid}/pgrn
でGroongaのDBを開いて
select Groongaのテーブル名 --output_columns _id,ctid
で確認すると、
select id, pgroonga.ctid(memos) from memos;
で確認したctidと対応はとれているようでした。

またPostgreSQL側のテーブルをtruncateしたときも
select pgroonga.table_name('pgroonga_content_index');
で確認するとGroongaのテーブル名は変更されていました。

ということで、現状の実装としてはvacuum fullやtruncateすると
Groongaのテーブルは新しく作りなおされ、ctidの対応はとれているようです。


ctidで紐付けするので実装上は問題無いとのことで安心しました。
解説ありがとうございました。


本題と外れるのですが、元記事は新規スレッドで投稿するつもりだったのですが、
gmail上での宛先コピペ操作ミスなのか、無関係の別スレッドに繋げてしまってすみませんでした。

-- 
中村 弘輝 )Hiroaki Nakamura)
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Download 



groonga-dev メーリングリストの案内
Back to archive index