4

私は postgresql hstore 拡張機能を使用しており、データが内部でどのように保存されているのか興味があります。実装の詳細を確認するには、hstore ソース コードのどこを参照すればよいか教えてください。

4

2 に答える 2

9

hstorehttp://git.postgresql.org/および GitHubにある主要な PostgreSQL ディストリビューションの一部です。ここhstoreに git headがあります。

varlena として保存されているように見えます。つまり、他のものと同じように TOASTable です。欠点は、キーを抽出するために、少なくともフィールドが圧縮されている場合は、ディスクからフィールド全体を読み取る必要があることです。

これはまた、他の通常のフィールド値と同様に、フィールドの任意の部分を更新するには、タプル全体 (行) の新しいコピーをテーブルに書き込む必要があり、古いものは有効期限が切れたときに有効期限をマークする必要があることを意味します。トランザクション ( Pg マニュアルのMVCCを参照)。データの一部が変更されるたびに全体 (およびそれを含む行) を書き換える必要があるため、大きなhstoreデータは頻繁に変更されるデータには望ましくありません。

ソースには、hstore の値がどのように構造化および格納されるかの概要を示すコメントがあまり含まれていないようで、すぐに理解するにはマクロの森のようなものです。

于 2012-10-30T06:42:02.440 に答える
3

ストレージ自体はかなり驚くべきことではありません。

楽しい部分は、次のようなクエリに効率的に答えることができるようにインデックスを作成する方法です

'周波数 => 16.7, 鉄道 => "鉄道"' <@ タグ;

(これは実際の例からのものです)意味:「(hstore)フィールドにマッピング頻度=> 16.7および鉄道=>レールが「含まれる」すべてのレコードを検索します。

注意:これは単なる記憶によるものです。

これには 2 つのコンポーネントがあります。

1 つ目はGiST indexです。これは一種の「ずさんな B ツリー」と見なすことができます。これは、どのブランチを取るべきかを正確に教えてくれないことがありますが、いくつかのブランチのセットを提供します。PostgreSQL はこれを幾何学的インデックスなどに使用します (たとえば、ポイントがポリゴン内にあるかどうかを問い合わせることができます)。インデックスは完全にヒットするわけではありませんが、検索スペースを大幅に削減する可能性があります。

次に、GiST を利用するための「ハッシュ」(Perlist の場合)/「辞書」(Python の場合) のエンコーディングがあります。ハッシュの各キーと各キー/値のペアを小さな int にハッシュします (詳細はファジーですが、0..255 と仮定します)、このサイズのビットフィールドを取得し、取得したハッシュ値のそれぞれに対してビットフィールドに穴を開けます (Knuth には、開いた/閉じた穴があるインデックスカードの良い例があったと思います彼らのリムと編み針 - はい、ここにあります .

それなら、その二人と結婚するしかない。AFAIR Oleg Bartunov と Theodor Tsigaev がそれを思いつきました。初めて見たとき頭が爆発した。

于 2013-07-10T07:47:40.400 に答える