2011-02-07 6 views
5

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

3つの参照列(EG:foo_id、bar_idおよびbaz_id)を持つpostgresql表があり、いずれかの列に値が1つのみ(他の2列はNULLにする)。しかし、私はすべての3つの列を索引付けする必要があります。各列が整数(postgresqlの4バイト)であると仮定すると、各行は4バイト(非NULL列の場合)+ 2ビット(2つのNULL列の場合)を占有する必要があります。ただし、3つの列すべてに索引を追加する場合、3つの索引の記憶域は、12バイト(索引がNULL値の場合は4バイト全体を占める場合)または4バイト+タプル自体。

+0

さて、あなたは部分的にこれを自分で答えることができることを1つの道 - 彼らはデータの種類によって必要とされるバイト(だけ)と同じ数で表現することができませんでした。あなたのintの例では、4バイトのすべての可能な組み合わせが有効なint値を表しているので、同じ4バイトでnullをコード化する方法はありません。 –

答えて

1

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

関連する問題