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

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 8月 11日 (火) 20:42:29 JST


須藤です。

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:

> pgroongaのソースを見ると
> https://github.com/pgroonga/pgroonga/blob/6d3600c12c5abda068facebacc44751eecd48eb9/pgroonga.c#L1027-L1036
> で static uint64 CtidToUInt64(ItemPointer ctid) という関数が定義されて
> おり、
> PostgreSQLのデータ行のctidをuint64型に変換してgroongaのテーブルのctid
> 列に格納しています。
> 
> 一方、
> https://www.postgresql.jp/document/9.4/html/ddl-system-columns.html
> のctidの説明を見ると
>> テーブル内における、行バージョンの物理的位置を表します。ctidは行バー
> ジョンを
>> 素早く見つけるために使うことができますが、行のctidは更新されたり、
> VACUUM FULL
>> により移動させられたりすると変わります。したがって、ctidは長期の行識
> 別子とし
>> ては使えません。論理行を識別するためには、OID、あるいはさらに良いの
> はユーザ
>> 定義の通番数を使うべきです。
> と書かれています。
> 
> この説明を読む限り、ctidをgroongaのテーブルに保存しておいてPostgreSQL
> のレコードとの紐付けに
> 使うのは良くないような気がします。

このドキュメントを読むとそう思いますよねぇ。

ですが、これで大丈夫なんです。
これはSQLで使う場合の話で、拡張機能としてインデックスを実装
する場合はそんなことはないんです。

というか、インデックスはctidを返すことを求められるので、ctid
を保存しておかないと適切な結果を返すことはできません。


VACUUM FULLしたときも大丈夫なのかは試さないとわからないんで
すが、GINもctidを格納しているように見えるので大丈夫じゃない
かなぁと思っています。

念のため試してみるか!という気持ちになったら結果を教えてもら
えるとうれしいです。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




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