web-dev-qa-db-ja.com

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

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

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

FK check details

  • Foreign Key References Countは、受信する外部キーの数です。
  • 一致するインデックス数はありませんは、適切なインデックスのない着信外部キーの数です。更新または削除されたテーブルがその制約に違反していないことを確認するには、子テーブルのスキャンが必要です。
  • Partial Matching Indexes Countが何を表すのかわかりません。

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

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

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

27
Joe Obbish

私は私よりはるかに賢く人々に話しました、そしてこれはすぐに文書化されます™。

これの実際の定義は、暫定的には次のとおりです。

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

加えて:

この数が0より大きい場合、部分一致の結果として行数が多くなる場合に、パフォーマンスの問題が発生する可能性があります。

13
Sean Gallardy

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

2013年3月1日、Carlos Klappのコードブログのブログ投稿Foreign Keys without Indexes と呼ばれるストアドプロシージャがありますUtil_FKsWithoutIndexes FK関係の適切なインデックスを持たない外部キーを探します。 (このブロガーが SQL Server CentralのThe Ultimate Index-Less Foreign-Key Finder(2009年10月15日) )ブログには次のように書かれています。

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

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

一致するインデックスがない、または部分的に一致するインデックスを持つ各外部キーのCREATE INDEXテンプレートを生成します。

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

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

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

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

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

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

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

3
RolandoMySQLDBA