검색 가능한 모든 열 또는 각 열에 개별적으로 비 클러스터형 인덱스를 만들어야합니까?
On 2월 15, 2021 by admin비 클러스터형 인덱스를 올바르게 사용하는지 잘 모르겠습니다. SSMS 계획 견적자는 다음 인덱스가 이미 테이블에있을 때 다른 인덱스를 추가한다고 말했습니다.
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones] ( [iso] ASC, [mzone] ASC, [postal] ASC ) INCLUDE ( [region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci], [zone_ups], [zone_fed] )
내 쿼리는
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
제 질문은 … 가능한 모든 조회 키에 대한 색인을 만들어야합니까? mzone, iso 및 postal로 여러 검색어를 검색합니다.
감사합니다
댓글
- 테이블?
- 예, 모든 열을 포함합니다.
- 모든 열을 단일 색인에 포함하는 것은 큰 도움이되지 않습니다. 우선 이러한 색인은 기본적으로 공간 요구 사항을 두 배로 늘립니다. 둘째, 가장 왼쪽에있는 n 개의 열에 만 사용할 수 있습니다. 마술처럼 테이블에서 17 번째 열을 더 빨리 검색 할 수는 없습니다 .
- 그리고 각 열에 대한 별도의 색인-언젠가 검색 할 수도 있기 때문에-또한 그다지 좋지 않습니다. 인덱스는 모든 삽입, 업데이트, 삭제에 대한 성능 측면에서 비용이 발생합니다. ' overindex 하지 마십시오. '는 인덱스가 전혀없는 것보다 거의 나쁩니다 ….
- @marc_s의 의견을 보내 주셔서 감사합니다. 바로 제가 찾고 있던 정보입니다. 또한 가질 수있는 비 클러스터형 인덱스 (예 : 5-10 개)의 범위가 적절하다고 말하는 것이 적절합니까, 아니면 순전히 테이블의 요구 사항과 관련이 있습니까? 그렇다면 어떤 종류의 항목과 관련이 있습니까?
답변
SQL Server는 인덱스를 표시합니다. 인덱스가 삶을 더 편하게 만들 것이라고 추정하기 때문에 사용하고 싶습니다. 모든 검색 가능한 필드에 인덱스를 만들 필요는 없습니다. 실제로 그렇게하면 쓰기 성능이 상당히 저하됩니다. 주어진 테이블에 5-10 개 미만의 인덱스가 있고 해당 쿼리를 항상 실행하는 경우 SSMS가 표시하는대로 정확하게 제안 된 인덱스를 추가 할 수 있습니다.
JNK의 아래 편집
제안 된 색인을 함께 살펴 보는 것도 중요합니다. 즉, 제안 사항은 모두 사일로에 있으므로 다른 인덱스에 INCULDE
d 필드를 추가하여 하나의 전체 제안 인덱스를 대체 할 수 있습니다.
예를 들어, 다음 두 가지 색인에 대한 제안이있을 수 있습니다.
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
사실 다음과 같은 두 가지 요구 사항을 모두 충족 할 수있는 경우
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
INCLUDE
목록을 사용하면 두 번째 색인이 필요하지 않습니다.
댓글
- @MaxVernon : SQL Server 인덱싱의 단계-1 부, 인덱스 소개 및 시리즈의 나머지 기사-소개에서 고급 항목에 이르기까지 SQL Server 인덱스에 대한 거의 모든 내용을 다룹니다.
- @MaxVernon : 또는 확인할 포함 된 열에 대한 논의는 포함 된 열을 사용한 커버링 색인 을 참조하세요. e an index " covering "
Answer
새 색인을 생성하라는 메시지가 표시되는 이유는 보유한 색인이 가능한 최적의 색인이 아니기 때문입니다. 쿼리 옵티마이 저는 사용할 인덱스를 선택하는 방식에서 매우 선택적입니다. 다음 링크는 선택성을 이해하는 데 도움이됩니다.
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
위에서 색인 내에 모든 열을 포함 시켰으며 본질적으로 테이블 데이터를 복제했다고 말했습니다. 이를 바탕으로 언급 한 열에 대해 3 개의 개별 인덱스를 생성하면 어떤 해가 될까요? 사용되는 공간은 적고 속도는 훨씬 빠릅니다. 나는 이것이 DTA / 실행 계획이 당신에게 말하는 것이라고 추측 할 수 있습니다.
쿼리에 의해 생성 된 실행 계획 세부 정보를보고 병목 지점을 식별하고이를 인덱스 설계 방법에 대한 지침으로 사용하십시오. SQL Server는 무엇이 가장 좋은지 아는 데 매우 능숙합니다. 그것이 말하는 것을 신뢰하십시오.
이것이 도움이되기를 바랍니다.
답글 남기기