5

NULL が行の postgresql タプル ヘッダーで 1 ビットしか占有しないことは容易に文書化されていますが、NULL は、NULL 可能な列 (タプルではなくインデックス) の INDEX でどのくらいのスペースを占有しますか? タプルと同じインデックス内の 1 ビットですか、それとも完全な列のデータ型サイズ (例: 整数 = 4 バイト) ですか?

質問のコンテキストは、3 つの参照列 (例: foo_id、bar_id、baz_id) を持つ postgresql テーブルがあり、任意の行について、それらの列の 1 つだけが値を持つことです (他の 2 つの列は NULL になります)。ただし、3 つの列すべてにインデックスを付ける必要があります。各列が整数 (postgresql では 4 バイト) であると仮定すると、各行は 4 バイト (null 以外の列の場合) と 2 ビット (2 つの null 列の場合) を占める必要があります。ただし、3 つの列すべてにインデックスを追加する場合、3 つのインデックスのストレージは 12 バイト (インデックスが NULL 値に 4 バイトをすべて使用する場合) または同じ 4 バイト + 2 ビットのいずれかになります。タプルそのもの。

4

1 に答える 1

1

btree アクセス ルーチンは、PageGetItem() を使用してインデックスから実際のキーを取得します。したがって、btree インデックス ページは通常のヒープ ページと同じストレージ スキーム (nullability マスクを含む) を使用していると思います。ページの「特別な」領域に、すべての btree ポインターを保持するための追加のナビゲーション情報があるだけです。

于 2011-02-07T15:16:43.603 に答える