2012-11-21 4 views
0

저는 SQLServer를 처음 접했을뿐만 아니라 실제로 저를 괴롭히는 한 가지가 있습니다. 여러분 중 한 사람이 무슨 일이 일어 났는지 설명해 주길 바래요. 심지어 낯선 사람 - - 내가 인덱싱 과정에서 활동 모니터를 실행하면약한 엔티티에서 별도의 인덱스가 필요한 이유는 무엇입니까?

나는 약한 엔티티 등 일부 쿼리가 예상보다 오래 가고 있음을 깨달았다 SQLServer에 양식의 약한 개체에 인덱스를 생성하는 것이 좋습니다

CREATE NONCLUSTERED INDEX [<INDEXNAME>] 
ON [dbo].[<TABLE>] ([<ID1>]) 
INCLUDE ([<ID2>]) 
GO 

이렇게 (실제로 두 열을 모두 인덱싱했지만 결과가 거의 같다고 생각합니다.) 실제로 쿼리 속도가 향상되었습니다 (최소한 활동 모니터에서 볼 수있는 것보다).

CREATE UNIQUE NONCLUSTERED INDEX [<INDEXNAME>] ON [dbo].[<TABLE>] 
(
    [<ID1>] ASC, 
    [<ID2>] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

내 질문은 : SQLServer가 클러스터 된 인덱스를 무시합니까? 그렇다면 왜? 어떻게 든 고칠 수 있을까요? 실제로는 기본 키 인덱스와 정확히 동일한 콘텐츠를 가지고 있어야하는 다른 인덱스를 추가하는 것이 이상하게 보입니다.

+0

약한 엔티티 란 무엇입니까? 어떻게 NHibernate와 관련이 있는가? –

+1

쿼리 나 클러스터 된 인덱스가 모두 표시되지 않기 때문에 무시할 수 있는지, 왜 그런지는 알아낼 수 없습니다. 아마도 열이 다른 순서일까요? MS SQL Server Management Studio의 "실행 계획 표시"기능을 사용하여 쿼리 실행 방법을 탐색해야합니다. –

답변

2

여러 가지 이유가있을 수 있습니다. 명확하게 클러스터 된 색인의 정의를 보여주십시오.

클러스터 된 인덱스가 ID2이고 ID1이면서 쿼리에서 두 개의 열을 모두 선택했지만 where 절에서 ID1을 사용하면이 새로운 비 클러스터형 인덱스가 더 빠르게 작동한다는 것을 알 수 있습니다.

클러스터되지 않은 인덱스가 1 열에 만 있지만 두 개의 열을 선택하는 경우 클러스터 된 인덱스로 이동하여 데이터를 조회해야하므로이 경우 두 번째 열을 INCLUDEd 열로 추가하거나 두 번째 인덱스 열은 SQL Server가 데이터 페이지를 건드리지 않아도되는 것을 방지합니다. 반면에 클러스터 된 인덱스가 같은 순서에있는 경우

, 그 중 하나 일 수있다 : 당신의 클러스터 된 인덱스에 대한

  1. 채우기 비율을 - 채우기 비율이 낮은 경우, 데이터가 퍼져있다 필요한 것보다 많은 데이터 페이지가 있고 밀도가 높은 비 클러스터형 인덱스를 읽는 것보다 느릴 수 있습니다.
  2. 클러스터 된 인덱스가있는 파일 그룹 (및 궁극적으로 디스크) - 다른 경우 쿼리 최적화 프로그램에서 높은 경합을 식별 할 수 있습니다 또는 클러스터 된 인덱스 디스크의 느린 탐색 속도
  3. 순차 데이터를 삽입했습니다. 클러스터 된 인덱스에 클러스터 된 인덱스 b- 트리가 이제 끝이났습니다.
  4. 테이블에 많은 삽입이 발생하여 많은 페이지 분할이 발생하여 클러스터 된 인덱스에서 데이터가 물리적 순서가되지 않게되었습니다.
  5. 클러스터 된 인덱스가 고유하지 않습니다 -이 경우 SQL 서버는 클러스터 된 인덱스에 유니 파이어를 추가하여 클러스터 된 인덱스를 더 크게 만들고 이에 따라 더 많은 데이터를 동등한 비 클러스터형 인덱스보다 더 많이 생성하므로 느려집니다.
  6. 클러스터형 인덱스 만 켜짐 1 열 (아래 참조)

클러스터 된 색인이 1 열 (예 : ID1) 인덱스 데이터는 인덱스에 대한 논리적 읽기가 2 개이지만 ID2 열 데이터는 인덱스의 리프에 있으며 깊이가 3입니다.

비 클러스터형 인덱스의 경우 데이터 페이지에 액세스 할 필요가 없으므로 논리적 읽기가 2 개만 필요하므로 비 클러스터형 인덱스는 1/3 빨라집니다.클러스터 된 인덱스와 클러스터되지 않은 인덱스가 저장되는 방법을

체크 아웃 :

Clustered Index Structures

Non-Clustered Index Structures

나를 그것이 알고 가자!

+0

안녕하세요, Dave, 답변 해 주셔서 감사합니다. :) 나는 그것이 아주 희소 한 쓰기 작업 만하고 내가 원할 때 언제든지 색인을 다시 작성할 수 있다고 가정 할 때 모든 것이 최적의 방법으로 해당 테이블의 색인을 생성하는 방법에 관한 문제로 귀결된다고 생각합니다. 원래의 가정은 프라이 머리 키를 가지고 있으면 충분하다는 것이 었습니다. 내 다음 가정은 클러스터 인덱스가 [A], [B]가 [A]를 포함한 인덱스 [B]를 추가하는 경우 '역방향'인덱스를 추가하는 것입니다. [B]를 포함하여 [A]를 추가해야합니까? 내 가정이 완전히 틀렸는가? – Markus

+0

원한다면 언제든지 다시 색인을 생성 할 수 있고 쓰기가 거의없고 최적의 읽기를 원할 경우 모든 쿼리 유형에 대해 비 클러스터형 색인을 작성하십시오. 예 : 당신의 쿼리가 tableX에서 A, B, C를 선택하면 A =? 그런 다음 A에 색인을 작성하고 B와 C의 다른 두 열을 포함하여 색인 색인으로 만듭니다. –

+1

귀하의 질문에 대답하기 위해 귀하의 가정은 어둠 속에서 추측하고 있습니다.이 경우 귀하의 색인 선택은 가지고있는 질문 유형에 따라 결정될 것입니다. 다른 예가 있습니다. SELECT A, B, C, D from tableX 여기서 A =? 그리고 C =? ORDER BY D DESC. CREATE INDEX ix1 on tableX (A, C, D DESC) INCLUDE (B) - 참고 :이 경우 A와 C를 바꿔서 비슷한 결과를 얻을 수 있습니다. –

관련 문제