0


0

このようなテーブルが2つあります。

表A

A_ID(主キー)A1 A2

表B

B_ID(主キー)B1 B2 A_ID(外部キーだがデータベースには適用されない、一意ではない)

デフォルトではSQL ServerはB_IDにクラスタ化インデックスを作成しますが、BにはA_IDに依存する多くのselectクエリがあります。

このようなもの

SELECT * FROM B WHERE B.A_ID = '一部のID'

表BのA_IDにクラスタ化インデックスを作成する必要がありますか?

2 Answer


3


いいえ、通常の非クラスタ化インデックスを作成するだけです。クエリ速度も基本的に同じ結果になり、同じ改善が見られます。

テーブルBのA_IDは一意であることさえ保証されていますか? "B"の複数のエントリが同じA_IDを参照できませんでした。

クラスタ化キーのベストプラクティスは次のとおりです。

  • できるだけ小さい(狭い)

  • 独特の

  • 安定している(または静的である - それは決して変わらない)

  • 増え続ける

Kim Trippの クラスタ化インデックスの議論は続きますまたはhttp://www.sqlskills.com/BLOGS/KIMBERLY/を参照してください。追加情報については、post /増え続けるクラスタ化鍵 - クラスタ化インデックス - 議論! - aspx [増え続けるクラスタ化鍵 - クラスタ化インデックスの議論 - agin!]。

クラスタ化キーの一意性が保証されない場合、SQL Serverはそれに4バイトの一意化子を追加します。クラスタ化キーはクラスタ化されていないすべてのエントリのすべてのエントリに追加されるためです。幅が広すぎるとスペースが無駄になります。

マーク


3


通常の非クラスタ化インデックスで問題ないはずです。 クラスタ化インデックスは、範囲クエリを実行するときに特に便利です(BETWEEN)経験則として、外部キー制約で使用される列には常に非クラスタ化インデックスを作成します。