3

EF 코드 첫 마이그레이션의 CreateIndex 구문을 사용하여 Covering Index를 만들 수 있습니까? (* Covering Index는 아래 참조)EF 코드 첫 번째 : CreateIndex - Covering 인덱스

예를 들어 나는과 같이 수동 마이그레이션에 간단한 인덱스를 만들 수 있습니다

CreateIndex("RelatedProduct", "RelatedId"); 

그것은 내부 공급자가 지원하는 어떤 처리 할 수있는 지정 "익명 인수"라는 이름의 최종 인수를 가지고 -하지만 그렇지 않은 그 지원이 무엇인지 어떻게 결정하는지 분명히해야합니다. 이것이 가능합니까 아니면 플랫 SQL에 의존해야합니까?

* Covering Index는 RDB가 기본 테이블에 대한 포인터뿐만 아니라 리프 노드에 중복 된 데이터를 저장하는 인덱스입니다. 색인의 열에 의해 재정렬 된 표가 본질적으로 중복되어 해당 검색 유형에서 가장 많이 사용되는 열만 포함됩니다.

답변

7

나는 커버링 인덱스가 쿼리를 다루는 클러스터되지 않은 인덱스라고 생각한다. (따라서 테이블에 추가로 조회 할 필요가 없다.) 리프 레벨에서 인덱스 키의 일부가 아닌 데이터를 포함 할 수있는 인덱스의 추가 기능을 설명합니다.

CreateIndex은 현재이를 지원하지 않습니다. Sql을 직접 사용하거나 EF의 소스 코드를 확인하고 INCLUDE에 대한 지원을 호출에 추가하고 CreateIndexOperation 및 관련 SQL Generator의 Generate 메서드를 호출 할 수 있습니다.

+0

예, 평범하지 않은 색인과 Covering 색인의 차이점은 정상적으로 색인입니다 데이터를 저장하지 않고 테이블에 대한 포인터 만 저장합니다. Covering Index는 컬럼의 일부 사본을 추가로 저장합니다. http://stackoverflow.com/questions/609343/what-are-covering-indexes-and-covered-queries-in-sql-server 소스를 조사하는 것이 좋습니다. 부탁드립니다. –

+0

네 말이 맞아. anonymousArguments arg가 나에게 희망을 주었지만 소스는 단순히 사전에 저장하고 아무것도하지 않는다. 아마도 미래의 기능 일 것이다. 그러나 소스를 포크 화하고이 기능을 추가하는 것이 합리적으로 가능합니다. System.Data.Entity.Migrations.Sql.SqlServerMigrationSqlGenerator에는 보호 된 가상 void Generate (CreateIndexOperation createIndexOperation) 메서드가있어이 속성을 추가 할 수있을만큼 똑바로 표시됩니다. –

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(")"); 
}