テーブルAにfk1とfk2があり、そのテーブルが同じように頻繁にfk1とfk2で結合されているが、まれにその両方で結合することはほとんどない。そして、fk1 + fk2が一意であると仮定します。中間テーブルをクラスタ化する必要がありますか?
このテーブルはインデックスfk1_and_fk2を持つべきですか?テーブルがそのインデックスにクラスタ化されるべきですか?
また、このテーブルにはfk1とfk2のインデックスがあり、そのうちの1つにクラスタ化されている必要がありますか?
テーブルAにfk1とfk2があり、そのテーブルが同じように頻繁にfk1とfk2で結合されているが、まれにその両方で結合することはほとんどない。そして、fk1 + fk2が一意であると仮定します。中間テーブルをクラスタ化する必要がありますか?
このテーブルはインデックスfk1_and_fk2を持つべきですか?テーブルがそのインデックスにクラスタ化されるべきですか?
また、このテーブルにはfk1とfk2のインデックスがあり、そのうちの1つにクラスタ化されている必要がありますか?
クエリを検討するだけの場合は、自動インクリメントのプライマリキーがあり、(fk1, fk2)
と(fk2, fk1)
を一意に定義する必要があります。これは、これらの列が決してNULL
ではないことを前提としています。あるいは、それを他の方法で定義することもできます。 (unique
でない場合は、インデックスを定義することができます)。
これにより、両方のタイプのクエリが高速化されます。さらに、これらの列のみを使用する照会では、元のデータ・ページを参照せずに索引を直接使用することができます。
自動インクリメント/アイデンティティ/生成の常時/シリアルプライマリクラスタ化キーを使用すると、挿入が常にテーブルの最後に移動するため、挿入が高速になります。 (もちろん、インサートはインデックスのページの中央にあります)
ダウンサイド?
同様の代替案は、ペアの1つをプライマリ(クラスタ化された)インデックスにすることです。これの欠点は、新しいインサートにページがオーバーフローすることです。