web-dev-qa-db-ja.com

文字可変インデックスのオーバーヘッドと長さの制限

文字が変化する列に一意の制約があり、その長さは主に約600ですが、1000万になる可能性があります。

B-Trees について読みましたが、インデックスが消費するディスク領域の大きさ、またはそのような大きなサイズの値がインデックスのパフォーマンスを妨げるかどうかを判断できません。

このように長さが長くなる可能性がある文字可変列のBツリーインデックスがディスク容量と時間に与える影響は何ですか?

3
user32234

Postgresでは、一意の制約は一意のBツリーインデックスで実装されます。 ドキュメントごと:

一意の制約を追加すると、制約で使用される列または列のグループに一意のbtreeインデックスが自動的に作成されます。

インデックスは、テーブルと同じ基本的な保存メカニズム、つまりデータページの配列を使用します。インデックスには、いくつかのマイナーな追加機能があります。 ドキュメントごと:

テーブルでは、アイテムは行です。インデックスでは、アイテムはインデックスエントリです。

すべてのテーブルとインデックスは、固定サイズ(通常は8 kBですが、サーバーのコンパイル時に別のページサイズを選択できます)のページの配列として格納されます。

インデックスエントリの最大サイズはデータページの3分の1です。これについてPeter Eisentrautを引用します。
PostgreSQLの主キーの長さの制限

それは2730バイト(または少し少ない)です。 UNIQUE制約が不可能であることを意味します

ハッシュ値を持つ冗長な列を追加し、thatに一意のインデックスを作成することを検討します。
組み込みの関数 md5() を使用するか、巨大な値に対してより効率的なものを使用できます。

パフォーマンスに焦点を当てた関連ソリューションは次のとおりです:
インデックスの最大行サイズエラー

8