SQL Server 2008 데이터베이스에서 비클러스터형 인덱스를 만드는 방법은 무엇입니까? 코드가 없는 것이 바람직합니까?

SQL Server 2008 데이터베이스에서 비클러스터형 인덱스를 만드는 방법은 무엇입니까? 코드가 없는 것이 바람직합니까?

코드를 사용하지 않고 SQL Server 2008 데이터베이스에서 비클러스터형 인덱스를 생성하는 방법에 대한 도움을 주시면 감사하겠습니다. SQL 쿼리를 실행하기 전에 단번에 '정적으로' 생성하는 것입니다. 비즈니스 애플리케이션의 일부인 SQL 쿼리를 실행할 때마다 인덱스를 생성하기 위해 SQL 명령을 실행하고 싶지 않습니다.

즉, 이상적으로는 Microsoft SQL Server 내에 Visual Studio 2010 Professional에 내장된 도구가 있습니다. (참고: 저는 ENTERPRISE 또는 ULTIMATE 에디션이 없습니다. 이는 Professional의 내장 SQL 관리자로 수행할 수 있는 작업에 큰 차이를 만듭니다. VERSION) 이 작업을 수행하려면 다른 도구가 없기 때문에(방금 살펴본 결과 Microsoft SQL Server 2008에는 적어도 내 시스템에는 필요한 것이 없다는 것을 알았습니다. 분명히 손상된 프리웨어 버전인 것 같습니다) ). 따라서 아래 테이블을 색인화하는 간단한 SQL 명령이 필요할 수 있습니다.

아래 참고 자료를 읽었지만 이를 수행하는 방법을 알 수 없습니다.

내 테이블은 다음과 같습니다.

Table CUSTOMER
Columns:

CustomerID = GUID - this is a unique primary key

CustomerDecimal1 = decimal- this is not unique, but 99% of the time it is unique   
compared to the rest of decimal fields.  I wish to index this field 1 of 2

CustomerDecimal2 = decimal- this is not unique, but 99% of the time it is unique
 compared to the rest of decimal fields. I wish to index this field 2 of 2

CustomerTextComments = vChar(50)

소수 필드는 WHERE 절에서 자주 사용되므로 Microsoft SQL Server 2008에서 지원되는 새로운 기능인 비클러스터형 인덱스에 이상적인 후보입니다.

내 플랫폼에 대한 추가 정보: 기존 데이터가 포함된 테이블이 이미 있지만 대부분 비어 있는 레코드가 몇 개만 있습니다. 저는 SQL 쿼리 생성 기능을 포함하여 많은 기능을 갖춘 Visual Studio 2010 내부의 서버 탐색기에서 작업하고 있습니다. 이상적으로는 Linq-to-entities에 인덱싱 방법을 작성하고 싶지만(실제로 SQL을 잘 모르기 때문에) 누군가가 이 테이블의 CustomerDecimal1, CustomerDecimal2 필드를 인덱싱하는 방법에 대한 전체 목록을 제공할 수 있다면 감사하겠습니다.

참고자료:

http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/ (WHERE 절 검색을 위한 SQL Server 2008의 새로운 '필터링된' 인덱스 속성)

http://en.wikipedia.org/wiki/Index_%28database%29#비클러스터형

-----업데이트됨

@mrdenny -- 시간을 내주셔서 감사합니다. 귀하의 명성이 매우 높다는 것을 알지만 귀하가 말하는 내용을 믿을 수가 없습니다. 예, 저는 고집이 세고 이를 거부라고 부릅니다! :-) 다른 사람이 볼 수 있기를 바라면서 이 스레드를 조금 더 열어 두겠습니다. 또한 기본적으로 SQL을 실행하지 않기 때문에 Entity Framework(EF 4.0) 내부의 Linq-to-엔터티만 유용하게 제공한 코드를 어디에 넣을지조차 알 수 없습니다("T/SQL to create a non-clustered index on") 두 개의 소수 열"). 나는 WHERE 검색에서 항상 두 개의 10진수 열을 사용하고 있으므로 첫 번째 SQL 명령이 나에게 적합합니다.

누구든지 Mr. Denny의 첫 번째 SQL 코드를 Linq-to-Entities로 변환할 수 있습니까? 실패하면 손을 내밀고 믿을 수 없다고 말할 것입니다. (인덱싱이 일종의 균형 잡힌 트리와 같아서 자동으로 시스템에 내장되어야 한다는 내용에 대해 제가 읽은 내용과 어긋납니다.) 또는 대안으로 저는 인덱싱을 통해 성능이 최대 20% 정도 향상될 수 있다는 내용을 읽었습니다. 좋지만 실제로 너무 걱정할 필요는 없습니다. 응, 신 포도야!

답변1

첫 번째 비클러스터형 인덱스는 SQL Server 2008의 새로운 기능이 아닙니다. 영원히 존재해 왔습니다. 필터링된 인덱스는 SQL Server 2008의 새로운 기능입니다.

SQL Server에 대해 쿼리를 실행하기 전에 어떤 인덱스를 만들어야 하는지 시스템이 파악하도록 할 수 있는 방법은 없습니다.

SQL Server에서 인덱스를 만드는 방법에는 두 가지가 있습니다. 하나는 T/SQL을 사용하는 것이고, 다른 하나는 그래픽 편집기가 있는 SQL Server Management Studio를 사용하는 것입니다. 그래픽 편집기는 단순히 T/SQL을 생성하고 데이터베이스에 대해 T/SQL을 실행합니다.

두 개의 소수 열에 비클러스터형 인덱스를 생성하는 T/SQL은 아래와 같습니다.

CREATE INDEX IX_CustomerDecimal1_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal1, CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)

데이터베이스 테이블을 검색할 때 두 개의 CustomerDecimal 필드를 독립적으로 사용할 계획이라면 각각에 대해 별도의 인덱스가 필요합니다.

CREATE INDEX IX_CustomerDecimal1 on dbo.CUSTOMER
(CustomerDecimal1)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)

CREATE INDEX IX_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)

두 경우 모두 포함된 열 목록에 반환할 열을 추가하여 생성되는 IO를 최소화해야 합니다.

관련 정보