2011-01-02 7 views
5

좋아요, 한 번 더 입력해야합니다. 나는 온라인으로 기사를 읽었으며 나는 아직도 명확한 대답을 찾지 못했다.SQL Server 2008 비 클러스터형 인덱스에는 클러스터형 인덱스 필드가 포함되어 있습니까?

SQL Server 2008에는 약 50KB의 레코드와 모든 쿼리에서 동일한 방식으로 사용되는 많은 읽기 작업이 포함 된 "핵심"테이블이 있습니다. 이 데이터는 한 달에 한 번 업데이트되며 1 초에 수백 번 읽습니다.

데이터에는 자주 액세스 할 때 필드에 클러스터형 인덱스가 있습니다. 그냥 포함 "에 열 여분의 몇 가지를 넣어 감각을 만들 것, 그래서 그것보다 훨씬 더 많은 데이터가없는

클러스터 된 인덱스 이제

Field1 int 
Field2 int 
Field3 int 
Field4 int 
Field5 int 

:의는 클러스터 된 인덱스가 있다고 가정 해 봅시다 열 "이지만 SQL Server는 클러스터 된 인덱스에 포함 된 열을 허용하지 않습니다.

따라서 두 번째 인덱스는 클러스터 된 인덱스와 기본적으로 동일한 필드를 포함하고 있고 다른 열은 "포함 된 열"입니다. 그러나, 내가 읽은 것에서 이것은 중복 될 수 있다고 생각합니까?

커버 INDEX

Field1 int 
Field2 int 
Field3 int 
Field4 int 
Field5 int 

포괄 열

Field6 varchar(96) 
Field7 varchar(96) 

클러스터되지 않은 인덱스가 이미 정의 된 클러스터 된 인덱스에서 열이 있습니까

을 (클러스터되지 않은)?

그렇다면이 두 번째 인덱스는 (이미 클러스터형 인덱스에있는 것 이외에) 전혀 NO 열을 사용하지 않고 어떻게 만들 수 있습니까? 즉, "이 색인은 클러스터 된 색인과 정확히 동일합니다 ... 몇 개의 포함 된 열과 함께"라고 말하고 싶습니다.

또는 모든 열을 클러스터 된 인덱스 (레코드를 식별하지 않는 두 인덱스 포함)에 넣는 것이 좋습니다. varchar 열은 업데이트 빈도가 높아지고 (월 1 회가 아니라 하루에 몇 번) 클러스터 된 인덱스에서 제외 시키려면 좋겠지 만 충분히 깊으므로 영향을받지 않을 것입니다. 변경이 발생할 때 재조정을 일으킬 정도로 충분히 색인 된 트리.

그래서이 테이블의 모든 열이 테이블로 돌아 가지 않고 인덱스를 통해 사용할 수 있도록 이러한 인덱스를 설정하는 효율적인 방법이 있습니까?

답변

4

클러스터 된 인덱스에는 포함 할 필요가 없습니다. Includes는 인덱스 트리의 최하위 레벨에 여분의 데이터를 저장하는 것을 의미합니다. 이 은 클러스터 된 인덱스의 데이터 인입니다. 따라서 겹치는 색인이 필요하지 않습니다.

그러나 메모리 공간이 염려되는 경우 테이블을 축소해야합니다. 50k 행으로 -32768부터 시작하는 smallint 대리 키를 고려할 것입니다. 그런 다음 모든 NC 인덱스에서 C 키의 오버 헤드를 제거합니다. 즉, 질문에 언급 된 커버리지 인덱스를 가질 수 있습니다.

일단 실행 계획이 캐시되고 데이터가 캐시에 저장되면 쿼리는 메모리에서 가져옵니다. 귀하의 사용량은 얼마 동안 캐시에 남아있게됩니다. 업데이트가 없다는 것은 통계 기반의 재 컴파일을 얻지 못한다는 것을 의미합니다.

그러나 데이터가 거의 정적 인 경우 성능이 중요한 경우 왜 SQL Server를 호출해야합니까? 캐시 해. 아마도 캐싱 코멘트를 기반으로하는 가장 큰 오버 헤드 인 네트워크 왕복을 제거하십시오. 우리는 서버 부하를 줄이기 위해 클라이언트에 조회 및 캐싱을 아웃소싱합니다 (최대 부하에서 약 20 초 동안 50K 쓰기)

+0

여기에있는 모든 대답은 꽤 비슷하지만 질문을 필수 사항으로 간과하고 너무 많은 RDBMS 이론 없이는 필요한 "실행 가능한"정보를 제공했다고 생각합니다. 감사! – Flipster

5

예 - 비 클러스터형 인덱스는 클러스터형 키 (테이블에 클러스터형 키가있는 경우에는 행 ID가없는 경우 행 ID)를 통해 테이블의 데이터에 액세스하므로 클러스터형 인덱스 필드가 자동으로 포함됩니다. 또한 클러스터 된 인덱스를 변경하면 모든 클러스터되지 않은 인덱스가 강제로 다시 빌드됩니다.

2 개의 포함 필드가있는 추가 NC 인덱스는 해당 인덱스가 많은 수의 쿼리를 만족시키는 경우 유효 할 수 있지만 올바른 문제를 해결하고 있는지는 확실하지 않습니다.

클러스터 된 키 내에 2 개의 필드를 추가하는 것이 이상적이지는 않습니다. 이제는 NC 인덱스 내에서 확인됩니다. 테이블의 모든 인덱스가 클러스터 된 키를 포함하여 각 인덱스를 확장하는 것을 볼 수 있습니다.

클러스터 된 키를 가능한 한 좁게 만들려면 주된 이유가 있습니다. 클러스터 된 키를 선택해야하는 이유를 묻는 질문에 클러스터 된 키를 검사해야하며, 선택하면 조각화가 발생합니까?

클러스터 된 키의 인공 값 (Identity)을 사용하는 것이 더 좋을 수 있으며 고유 한 NC 인덱스를 사용하여 클러스터 된 5 개의 필드 키와의 고유성을 강화할 수 있습니다.

+0

큰 반응입니다. 이 예제에서 테이블에는 "ID"열이 있지만 기본적으로 의미가 없으며 사용되지 않습니다. 모든 쿼리는 이러한 인덱싱 된 필드를 통해이 테이블의 데이터를 요청합니다. – Flipster

+0

어떤 조각화로도 살 수 있다고 가정하면 클러스터형 인덱스로 사용할 수 있습니다. 2 개의 추가 필드가있는 NC 인덱스는 성능이 향상 될 수 있지만 (클러스터 된 테이블의 너비와 인덱스의 너비에 따라 다름) 선택/삽입 비율 등을 알아야합니다. 인덱스에 접근하여 – Andrew

+0

을 튜닝했다. 선택은 100 회/초이다. 삽입 = 1 회/월. 가장 실용적인 용도로 읽기 전용 데이터입니다. – Flipster

1
그냥 "포괄 열"로 열 여분의 몇 가지를 넣어하는 것이 을 만들 것

하지만 SQL 서버는 클러스터 된 인덱스

포함 여분의 열을 열을 포함 할 수 없습니다 클러스터 된 인덱스에 이미 모든 열이 포함되어 있기 때문에 불가능합니다. 이것이 인덱스가 클러스터 된 이유입니다.

그래서 우리는 "포괄 열"과 같은 다른 의 열과 함께 클러스터 된 인덱스로 본질적으로 같은 필드와 두 번째 인덱스가 있습니다. 그러나 내가 읽은 바에 따르면 은 이것이 중복 될 수 있다고 생각합니까?

네, 아마 중복 될 수 있습니다. 드물게 클러스터 된 인덱스가 메모리에 맞지 않는 예외가 있습니다.

는 가에 정의 된 클러스터 인덱스에서 열이 이미 클러스터되지 않은 인덱스를합니까?

아마 : 클러스터되지 않은 인덱스에는 클러스터 된 인덱스에 대한 포인터가 들어 있습니다. 클러스터 된 인덱스가 고유 한 경우이 포인터는 모든 클러스터 된 인덱스 필드로 구성됩니다. (대부분의 경우,이 필드는 기본 키에 해당합니다.)이 테이블의 모든 열이없는 색인을 통해 사용할 수 있도록

그래서, 까지 이러한 인덱스를 설정하기위한 효율적인 방법이 테이블에 돌아갈까요?

예제에서는 클러스터 된 인덱스로 충분하고 테이블 조회를 피하기 위해 다른 인덱스가 필요하지 않은 것처럼 보입니다. 쿼리를 실행하고 "키 조회"또는 "제거 조회"작업을 찾으십시오.

+0

SQL Server에 데이터 구성 방법에 대한 "힌트"를 제공하기 위해 모든 열을 클러스터 된 인덱스에 넣는 것이 합리적일까요? 데이터에 대한 특정 계층 구조가 있으며 SQL Server가이 계층 구조에 따라 데이터를 액세스하는 방식으로 구성하려고합니다. – Flipster

1

여러분은 CLUSTERED 및 NONCLUSTERED 인덱스를 더 잘 이해해야한다고 생각합니다. 클러스터형 인덱스는 각 노드에 인덱스의 키 열이 들어있는 균형 트리 (B 트리)입니다. 일반적으로 가장 좋은 옵션은 색인의 핵심 열입니다. 각 행에 대한 모든 데이터는 클러스터 된 인덱스의 리프 레벨 (즉, 최하위 레벨)에 저장된다. 따라서 클러스터 된 인덱스에 열을 포함 할 수 없습니다. 모든 열은 정의에 포함됩니다.

클러스터되지 않은 인덱스도 B- 트리 구조입니다. 각 노드에는 색인에 대한 키 열이 있습니다. 비 클러스터형 인덱스의 리프 수준에는 포함 된 열이 포함됩니다. 키 열과 포함 된 열의 차이점은 키 열 값이 인덱스의 각 수준에 나타나고 포함 된 열은 리프 수준에만 나타납니다.리프 수준에는 인덱스를 테이블 데이터에 연결하는 데 사용되는 클러스터 된 인덱스의 키 열이 포함됩니다.

색인에 포함하는 열의 수가 많을수록 색인이 커집니다. 그리고 이로 인해 성능이 저하 될 수 있습니다.

따라서 클러스터 된 인덱스의 경우 모든 열 또는 많은 열을 인덱스의 키로 포함 할 필요가 없습니다. 데이터는 이미 색인의 일부입니다.

+0

따라서 특정 사례의 경우 클러스터 된 인덱스를 통해 데이터를 이미 사용할 수 있으며 NC 인덱스는 관련이 없으므로 삭제해야한다고 말하고 있습니까? – Flipster

+1

비 클러스터링이 클러스터 된 인덱스와 거의 동일하면 NC 인덱스가 부적합합니다. 그러면 NC 인덱스는 모든 데이터를 가지고 있기 때문에 클러스터 된 인덱스가 더 나은 선택이 될 것이므로 사용되지 않을 것입니다. – bobs