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