EF Code First: CreateIndex - индекс покрытия

Можно ли использовать синтаксис CreateIndex первых миграций кода EF для создания индекса покрытия (см. Ниже, что такое индекс покрытия).

Например, я могу создать простой индекс в ручной миграции следующим образом:

CreateIndex("RelatedProduct", "RelatedId");

У него есть последний аргумент, называемый "анонимные аргументы", который указывает, что он может обрабатывать все, что поддерживает базовый поставщик, но не ясно, как я могу определить, какой будет эта поддержка. Это возможно или мне нужно прибегнуть к плоской SQL?

* Покрывающий индекс - это тот, где RDB хранит дублированные данные в конечных узлах, а не только указатели на основную таблицу. По сути, это дублирование таблицы, упорядоченной по столбцам в индексе, содержащем только столбцы, наиболее часто используемые в этом типе поиска.

2 ответа

Решение

Я думаю, что покрывающий индекс - это некластеризованный индекс, который покрывает запрос (поэтому он не требует никаких дополнительных поисков в таблице). То, что вы описываете, является дополнительной функцией такого индекса, которая позволяет вам включать данные, которые не являются частью ключа индекса на уровне листа.

CreateIndex не поддерживает это сейчас. Вы должны либо использовать Sql непосредственно или вы можете проверить исходный код EF и добавить поддержку для INCLUDE в CreateIndex вызов, CreateIndexOperation и связанные Generate метод в генераторе SQL.

Вы не можете использовать вызов CreateIndex, чтобы сделать это, но вы можете предоставить свою собственную альтернативу со стороны без изменения источника EF. Суть его заключается в создании необработанного Sql в вашем методе Up() при ручной миграции, например:

// 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(")");
}
Другие вопросы по тегам