3

EF Code First Migrations の CreateIndex 構文を使用してカバリング インデックスを作成することは可能ですか (*カバリング インデックスとは何かについては以下を参照してください)。

たとえば、次のように手動移行で単純なインデックスを作成できます。

CreateIndex("RelatedProduct", "RelatedId");

基になるプロバイダーがサポートするものは何でも処理できることを指定する「匿名引数」という名前の最後の引数がありますが、そのサポートが何であるかをどのように判断するかは明確ではありません。これは可能ですか、それともフラット SQL に頼る必要がありますか?

*カバリング インデックスとは、RDB がメイン テーブルへのポインタだけでなく、重複データをリーフ ノードに格納するインデックスです。これは基本的に、そのタイプの検索で最もよく使用される列のみを含む、インデックス内の列によって並べ替えられたテーブルの複製です。

4

2 に答える 2

7

カバーするインデックスは、クエリをカバーする非クラスター化インデックスであると思います(したがって、テーブルへの追加のルックアップは必要ありません)。あなたが説明するのは、リーフレベルのインデックスキーの一部ではないデータを含めることを可能にするそのようなインデックスの追加機能です。

CreateIndex現在はサポートしていません。Sql直接使用するか、EF のソース コードを確認しINCLUDECreateIndex呼び出しのサポートを追加し、SQL ジェネレーターCreateIndexOperationで関連するメソッドを使用する必要があります。Generate

于 2013-02-14T19:38:02.803 に答える
1

これを行うために CreateIndex 呼び出しを使用することはできませんが、EF のソースを変更することなく、側から独自の代替手段を提供できます。その核心は、次のように、手動移行の Up() メソッドで生の Sql を発行することです。

// Build a string like
//@"create nonclustered index IX_IsPublished_OrderIndex
//on Project (IsPublished desc, OrderIndex asc)
//include [Key]"
var sb = new StringBuilder();
sb.Append("create nonclustered index [")
.Append(Name)
.Append("] on [")
.Append(Table)
.Append("] (")
.Append(String.Join(", ", Columns
    .Select(col => "[" + col.Name + "] " + (col.IsAsc ? "asc" : "desc"))
))
.Append(")");

if (Include != null && Include.Length > 0)
{
    sb.Append(" include (")
    .Append(String.Join(", ", Include.Select(c => "[" + c + "]")))
    .Append(")");
}
于 2015-12-11T02:03:10.953 に答える