確かにそうです。この関連する質問の下で詳細に議論しました。
スペースはの倍数で割り当てられMAXALIGN
ます。これは通常、64ビットOSでは8バイト、32ビットOSでは(あまり一般的ではないが)4バイトです。不明な場合は、を確認してくださいpg_controldata
。また、インデックス付き列のデータ型(一部にはアライメントパディングが必要)および実際のコンテンツにも依存します。
たとえば、2つのinteger
列(各4バイト)のインデックスは、通常、1つだけのインデックスとまったく同じサイズになり、アライメントパディングのために別の4バイトが失われます。
そのような場合には上のインデックスを使用するクエリプランナには欠点が本当にありません(a,b)
-ちょうど上のインデックスに比べて(a)
。一般に、複数のクエリで同じインデックスを使用することをお勧めします。共有されると、その(またはその一部)が(高速)キャッシュに常駐する可能性が高まります。
のインデックスを既に保持している場合(a,b)
、それだけで別のインデックスを作成することは意味がありません(a)
- 大幅に小さい場合を除きます。vs.にも同じことが当てはまりません。詳細については、最初の行のリンクに従ってください。(b,a)
(a)
反対方向から来て、そのような追加のインデックスが必要な場合は、可能であれば(a,b)
既存のインデックスを削除することを検討して(a)
ください。多くの場合、これはPKまたはUNIQUE
制約のインデックスであるため不可能です。Postgres 11以降b
では、INCLUDE
代わりに句を使用して制約定義に追加するだけで済みます。マニュアルの詳細。
または、(b,a)
代わりに新しいインデックスを作成して、クエリをb
追加でカバーします。等価条件の場合のみ、btreeインデックスのインデックス式の順序は関係ありません。ただし、範囲条件が関係する場合は実行されます。見る:
アライメントパディングで失われたスペースのみを使用する場合でも、インデックスに追加の列を含めることには潜在的な欠点があります。
- 追加の列が更新されるたびに、インデックスの更新も必要になります。これにより、書き込み操作にコストがかかり、インデックスの膨張が増える可能性があります。
- テーブルのHOT更新(ヒープのみのタプル)は、インデックス列が関係している間は実行できません。
HOTアップデートの詳細:
オブジェクトサイズの測定方法: