2017-04-15 11 views
0

テーブルAにfk1とfk2があり、そのテーブルが同じように頻繁にfk1とfk2で結合されているが、まれにその両方で結合することはほとんどない。そして、fk1 + fk2が一意であると仮定します。中間テーブルをクラスタ化する必要がありますか?

このテーブルはインデックスfk1_and_fk2を持つべきですか?テーブルがそのインデックスにクラスタ化されるべきですか?

また、このテーブルにはfk1とfk2のインデックスがあり、そのうちの1つにクラスタ化されている必要がありますか?

答えて

1

クエリを検討するだけの場合は、自動インクリメントのプライマリキーがあり、(fk1, fk2)(fk2, fk1)を一意に定義する必要があります。これは、これらの列が決してNULLではないことを前提としています。あるいは、それを他の方法で定義することもできます。 (uniqueでない場合は、インデックスを定義することができます)。

これにより、両方のタイプのクエリが高速化されます。さらに、これらの列のみを使用する照会では、元のデータ・ページを参照せずに索引を直接使用することができます。

自動インクリメント/アイデンティティ/生成の常時/シリアルプライマリクラスタ化キーを使用すると、挿入が常にテーブルの最後に移動するため、挿入が高速になります。 (もちろん、インサートはインデックスのページの中央にあります)

ダウンサイド?

  • 複数のインデックスを更新する必要があるため、挿入(および更新と削除)は少し遅くなります。
  • これは、元のテーブルよりもはるかに多くの領域を必要とします。

同様の代替案は、ペアの1つをプライマリ(クラスタ化された)インデックスにすることです。これの欠点は、新しいインサートにページがオーバーフローすることです。

関連する問題