クラスター化された、またはクラスター化されていないインデックスは、インデックスの左端のキーがフィルター処理されている場合にのみ、クエリオプティマイザーで使用できます。したがって、列(A、B、C)にインデックスを定義する場合、[email protected]
のWHERE条件 、[email protected]
または[email protected] AND [email protected]
インデックスを完全には活用しません(注を参照)。これは、結合条件にも適用されます。 A
を含むWHEREフィルター インデックスを検討します:[email protected]
または[email protected] AND [email protected]
または[email protected] AND [email protected]
または[email protected] AND [email protected] AND [email protected]
。
したがって、あなたの例では、part_no
にclustredインデックスを作成すると 左端のキーとして、特定のpart_id
を検索するクエリ しない インデックスを使用し、別の非クラスター化インデックスがpart-id
に存在する必要があります 。
ここで、多くのインデックスのどれをクラスター化する必要があるかという質問について説明します。 1。重要度と頻度がほぼ同じで、必要なキーに関して互いに矛盾するクエリパターンが複数ある場合(たとえば、どちらかによる頻繁なクエリ part_no
またはpart_id
)次に、他の要因を考慮に入れます:
- 幅 :クラスター化されたインデックスキーは、 allによってルックアップキーとして使用されます その他の非クラスター化インデックス。したがって、幅の広いキー(たとえば、2つの単一識別子列)を選択すると、他のすべてのインデックスの幅が広くなり、より多くのスペースを消費し、より多くのIOを生成し、すべての速度が低下します。したがって、読み取りの観点から同等の優れたキーの間で、クラスター化されたものとして最も狭いキーを選択し、クラスター化されていないものを広くします。
- 競合 :挿入と削除の特定のパターンがある場合は、それらを物理的に分離して、クラスター化されたインデックスの異なる部分で発生するようにしてください。例えば。テーブルが一方の論理端にすべての挿入があり、もう一方の論理端にすべての削除があるキューとして機能する場合は、物理的な順序がこの論理的な順序と一致するようにクラスター化インデックスをレイアウトしてみてください(例:エンキュー順序)。
- パーティション化 :テーブルが非常に大きく、パーティショニングをデプロイする予定の場合、パーティショニングキーはクラスター化インデックスである必要があります。典型的な例は、スライディングウィンドウパーティションスキームを使用してアーカイブされた履歴データです。エンティティが「entity_id」のような論理主キーを持っている場合でも、クラスター化されたインデックスは、パーティショニング機能にも使用される日時列によって実行されます。
- 安定性 :頻繁に変更されるキーは、クラスター化されたキーの値を更新し、すべてを強制するため、クラスター化されたキーの候補としては不適切です。 非クラスター化インデックスは、格納されているルックアップキーを更新します。クラスタ化されたキーを更新すると、レコードが別のページに再配置される可能性が高いため、クラスタ化されたインデックスで断片化が発生する可能性があります。
注:完全にではありません エンジンが非クラスター化インデックスを選択してスキャンする場合があるため、活用してください。 クラスター化されたインデックスの代わりに、単に幅が狭く、スキャンするページが少ないためです。私の例では、(A、B、C)にインデックスがあり、[email protected]
にWHEREフィルターがある場合 クエリプロジェクトC
、インデックスは使用される可能性がありますが、完全なクラスター化スキャンよりも高速であるため、スキャンとしてのシークとしては使用されません。