代理キーを取り除くことはできますID
か?
はいの場合は、次の作成を検討してください。
- 上のプライマリおよびクラスタリングキー
{ParentID, ChildID}
。
- のセカンダリ インデックス
{ChildID, ParentID}
ですが、インデックスにも含めます ( INCLUDEキーワードRelationshipType
を使用します)。
このように、 3 つのケースすべてでカバリングインデックスがあるため、ダブル ルックアップの代価を支払う必要はありません (通常、クラスター化されたテーブルのセカンダリ インデックスに必要です)。
... WHERE ParentID = @SomeID
インデックスの B ツリーでの単純なシークで満たすことができます: {ParentID, ChildID}
。ChildID
およびRelationshipType
1の値は、この B ツリーの見つかったリーフから直接取得できます。
... WHERE ChildID = @SomeID
インデックスの B ツリーでの単純なシークで満たすことができます: {ChildID, ParentID}
。ParentID
およびRelationshipType
2の値は、この B ツリーの見つかったリーフから直接取得できます。
... WHERE ParentID = @SomeID AND ChildID = @SomeOtherID
どちらでも満足できます。
1クラスタリング キーはテーブルの「メイン」B ツリーであり、一意の列だけでなく、すべての列が含まれます。
2に感謝しINCLUDE (RelationshipType)
ます。
現在と同様のことを行うことID
は可能ですが、2 つではなく 3 つのインデックスが必要になり、カバーを達成するにはすべてが太くなります。確実に測定する必要がありますが、これは価値があるよりも面倒なことになると思います.
それ以外の場合は、クラスタリングをまったく使用しないでください。以下に通常のインデックスを作成するだけです。
{ID}
- 通常の非クラスタ プライマリ インデックス (NONCLUSTERED キーワードを使用)。
{ParentID}
- 通常のセカンダリ インデックス。
{ChildID}
- 通常のセカンダリ インデックス。
通常のヒープ テーブルがあるため、アクセスごとにインデックス シーク + (通常は) テーブル ヒープ アクセスが必要になりますが、インデックスはスリムに保たれ、キャッシュの有効性が向上します。
... WHERE ParentID = @SomeID AND ChildID = @SomeOtherID
2つのインデックスシーク(または、どちらか{ParentID}
または{ChildID}
インデックス+テーブルヒープアクセスのシーク)が必要になりますが、これはまだかなり高速であり、頻繁ではありません(あなたが述べたように)。
いずれかの方法を決定する前に、現実的な量のデータを測定してください。