「部分一致インデックス」とは何ですか?


27

SQL Server 2016で導入された「外部キー参照チェック」クエリプラン演算子について詳しく学習しようとしています。これに関する情報はあまり多くありません。マイクロソフトはここでそれを発表し、私はここでそれについてブログを書きまし。new演算子は、254以上の着信外部キー参照を持つ親テーブルから行を削除することで確認できます:dbfiddle link

オペレーターの詳細には、3つの異なるカウントが表示されます。

FKチェックの詳細

  • 外部キー参照カウントは、着信外部キーの数です。
  • 一致するインデックス数は、適切なインデックスのない着信外部キーの数です。更新または削除されたテーブルがその制約に違反しないことを確認するには、子テーブルのスキャンが必要です。
  • 部分一致インデックスカウントが何を表すのかわかりません。

このコンテキストでの部分一致インデックスとは何ですか?次のいずれかを動作させることができませんでした。

  • フィルター選択されたインデックス
  • 外部キー列をINCLUDEインデックスの列として配置する
  • 2番目のキー列として外部キー列を持つインデックス
  • 複数列の外部キーの単一列インデックス
  • 複数の列の外部キーに対して「インデックス結合」プランを有効にするための複数のカバーインデックスの作成

Dan Guzmanは、インデックスキーの順序が外部キーの列と異なる場合でも、複数の列の外部キーがインデックスと一致する可能性があることを指摘しました。彼のコードは、誰かが部分一致インデックスについてさらに理解するための出発点としてそれを使用できる場合に備えてここにあります。

回答:


13

私は自分よりずっと賢い人たちと話をしましたが、すぐにこれを文書化するつもりです™。

これの実際の定義は次のとおりです。

PartialMatchingIndexCountは、インデックスシークを使用してチェックできる参照の数を反映しますが、インデックスキーはチェックされるすべての列をカバーしません。たとえば、対応するForeignKeyReferenceCheck要素には、Seek PredicatesとPredicate要素の両方が含まれます。

加えて:

この数が0より大きい場合、部分一致により多数の行が生成される場合、潜在的なパフォーマンスの問題があります。


6
実用的な例または実際のドキュメントは素晴らしいでしょう。バウンティを提供
トムV-チームモニカ

3

さらにいくつかのグーグル検索を行った後、「部分一致インデックス」と外部キーに言及する投稿を思いつくことができました。

題しカルロス・クラップのコード2013年3月1日のブログのポストブログは、Foreign Keys without Indexesストアドプロシージャを呼び出したUtil_FKsWithoutIndexesFK関係のための適切なインデックスを持たない外部キーを探しています。(このブロガーはSQL Server CentralThe Ultimate Index-Less Foreign-Key Finderからこれを解除したようです(2009年10月15日))ブログには次のように書かれています:

完全に一致するインデックスを持たない外部キー制約を検索します。

最適な部分一致インデックスは、MatchCountsおよび列比較で出力されます

一致するインデックスがない、または部分的に一致するインデックスを使用して、外部キーごとにCREATE INDEXテンプレートを生成します。

必要に応じてカスタマイズします(クラスター化する場合、主キーの一部にする必要がある場合、または別のインデックスとマージする場合、インクルードを追加します)

完全一致インデックスが欠落しているFKは、参照整合性をチェックするためのテーブルスキャン、および外部キー列がWHEREまたはJOIN述部にある参照テーブルでのSELECTSにより、参照テーブルでのDELETESのパフォーマンスを著しく損なう可能性があります。 (これは、制約が存在するかどうかに影響します)。これは、インデックスの最初のN列のみをチェックします。Nは外部キー制約の列数です。

インデックス列の順序はこれを超えて検証されません(3-colインデックスの2番目の列に1つの一致する列がある2列のFKは部分一致として出力されます)

データベースに外部キー制約がない場合、このツールは役に立ちません。

多くのデータベースには、部分的な外部キー制約が適用されます。これは、制約が宣言されている関連テーブルでのみ機能します。

これを正しく理解している場合、FKリレーションシップに必要なインデックスのすべての列に一致するインデックスがない場合、いくつかの列を持つインデックスが存在する可能性があります。例えば、FK関係は3つの列がある場合(abc)が、これらの同じ3つの列のインデックスがない、そこ(持つインデックスが存在してもよいab)または(ac)または(bc)およびクエリを支援することができるであろうが列が欠落している行に対するインデックススキャンが必要です。

FK制約をサポートできるインデックスがまったくない場合、「部分一致インデックスカウント」はゼロ(0)になるか、少なくともこのカウントは増加しません。


これはあなたが念頭に置いていたものですか?それでも仕事にそれを得ることができない... dbfiddle.uk/...
ジョーObbish

ではない正確に。でFKを(FKey2,FKey3)作成し、でインデックスを作成してみてくださいFKey2。やってみてください。
RolandoMySQLDBA

私はSQL Serverの男ではないことを覚えておいてください。しかし、私はただ助けようとしているだけです。
RolandoMySQLDBA

試してみたいアイデアを理解し、感謝しています。また、2列1列を機能させることもできません。
ジョーオブビッシュ

あなたは溝を掘りcreate unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3)、インデックスをオンFKey2にして再試行することができます。
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.