「最も頻繁にクエリを実行する対象」は、クラスタリング用のインデックスを選択する最善の理由とは限りません。最も重要なのは、複数の行を取得するために何を照会するかです。クラスタリングは、最小限のディスク読み取り回数で複数の行を効率的に取得するための適切な戦略です。
最良の例は、顧客の販売履歴です。
Sales テーブルに 2 つのインデックスがあり、1 つは Customer にあるとします (おそらく日付ですが、要点はどちらにも当てはまります)。CustomerID で最も頻繁にテーブルをクエリする場合は、すべての顧客の Sales レコードをまとめて、すべてのレコードに対して 1 つまたは 2 つのディスク読み取りを行う必要があります。
主キーの OTOH は、代理キーまたは SalesId である可能性がありますが、いずれにしても一意の値です。これがクラスター化されている場合、通常の一意のインデックスと比較してメリットはありません。
編集: 議論のためにこの特定のテーブルを取り上げましょう - それはさらに微妙な点を明らかにします.
「自然な」主キーは、おそらくparentid + childidです。しかし、どの順序で?Parentid + childid は、childid + parentid よりも一意ではありません。クラスタリングの目的で、どの順序がより適切ですか? 「特定のアイテムについて、その構成要素は何ですか」と尋ねたいので、parentid + childid でなければならないと考える人もいるでしょう。しかし、それとは逆に、「特定の構成要素について、それはどの項目のコンポーネントですか?」と尋ねたいとは思わないのではないでしょうか。
クエリを満たすために必要なすべての情報をインデックス内に含む「カバリング インデックス」の考慮事項を追加します。そうであれば、残りのレコードを読む必要はありません。したがって、クラスタリングは何のメリットもありません。インデックスを読むだけで十分です。(ちなみに、これは、同じフィールドのペアに反対の順序で 2 つのインデックスを付けることを意味します。これは、このような場合に適切なことかもしれません。または、少なくとも一方に複合インデックス、もう一方に単一フィールド インデックス。 )
しかし、それでもクラスタ化する必要があるということにはなりません。これは最終的に、実際にはどのクエリが Quantity フィールドのレコードを取得する必要があるかによって決定されます。
このような明確な例であっても、他のインデックスについては、実際のデータでテストできるようになるまで (明らかに運用前に) 決定を下すのが原則として最善です。しかし、ここで推測を求めることは無意味です。テストは常に適切な答えを提供します。
問題が発生するまで (ほとんどの場合、発生することはありません)、挿入を遅くすることを心配する必要はありません。また、測定可能な利益のために有用なインデックスを放棄することを確認するためにテストできます。
ただし、このようなジャンクション テーブルは他の多くの種類のクエリにも頻繁に関与するため、まだ確実ではありません。そのため、アプリケーションがゲル化し、テスト用のデータ量が利用可能になったときに、必要に応じて 1 つを選択してテストします。
ところで、parentid + childid の PK で終わると思います。childid の一意でないインデックス。そして最初にクラスター化されました。サロゲート PK を使用する場合でも、parentid + childid にクラスター化された一意のインデックスが必要です。代理キーのクラスタリングが最適である可能性はほとんどありません。