포함 된 열과 필터링 된 인덱스


11

우리는 현재 이름이 tb_tranfers 인 테이블로 작업합니다 . 이 테이블에는 4 천만 개의 행이 있으며 크기는 ~ 26GB (11GB 데이터, 15GB 인덱스)입니다.

행의 10 ~ 15 %가 일시 삭제 된 행입니다 ( DeletedDate 가 널이 아님). 응용 프로그램은 DeletedDate 가 null 인 행만 사용합니다 . 이 테이블에 대한 모든 쿼리에는 해당 효과에 대한 절이 포함됩니다.

이 테이블에는 15 개의 색인이 있습니다. 누락 된 색인 DMV에는 DeletedDate 를 포함 된 열로 색인을 작성하기위한 제안 사항이 포함되어 있습니다.

WHERE DeleteDdate IS NULL클러스터되지 않은 11 개의 인덱스 모두 에서 필터링 된 인덱스를 사용하는 것이 도움이 됩니까? 또는 DeletedDate 열을 포함 열로 사용 하는 것이 더 좋 습니까?

답변:


12

예, 11 개의 NC 인덱스를 모두 필터링 된 인덱스 ( CREATE INDEX ... ON ... WHERE DeletedDate IS NULL)로 수정하면 도움이됩니다. 이렇게하면 두 가지 장점이 있습니다.

  • 쿼리 최적화는 행이 이미 이러한 인덱스에서 오는 것을 알 않습니다 그것을 두 번 확인 DeletedDate에 클러스터 된 인덱스를 조회 할 필요가 없습니다, 그래서 DeletedDate에 쿼리 필터를 만족
  • 모든 NC 인덱스는 크기가 10-15 % 더 작으므로 조회에 필요한 메모리와 IO 작업이 줄어 듭니다.

무역 오프 것입니다 어떤 부드러운 후 외모 행을 삭제하는 것이 쿼리 (행이 존재하지, 그렇지 않으면 왜, 어떤 쿼리가있을이가?)이 NC 인덱스를 사용할 수 없습니다.


7

당신이 경우 항상 사용 DeletedDate IS NULL쿼리에 필터를 다음 네 당신은 가능성이 필터를 추가하여 상당한 성능 향상을 볼 수 있습니다.

엔진이 관련 행을 찾기 위해 확인하는 페이지가 훨씬 적으므로 IO가 적고 속도가 빠릅니다.

INCLUDED필드 로 추가하는 것은 쓸모없습니다 . 필터에 항상 필터를 포함 시키므로 (선택한 목록에는 추가하지 않음) 필드를으로 추가하면 해당 필드가 참조되지 않습니다 INCLUDE.


2

행의 85-90 %에 DeletedDate가 NULL이므로 DeletedDate만으로 구성된 인덱스의 선택성이 SQL에서이 인덱스를 사용하기에 충분하지 않을 수 있습니다. 그러나 다른 선택적 열과 함께 사용하면 기존 인덱스에 DeletedDate를 추가하면 인덱스의 전체 선택성이 높아지면 약간의 이점이 있습니다.

JNK가 말했듯이 DeletedDate는 SELECT 절에서 인덱스를 사용하지 않으면 인덱스를 다루는 데 거의 쓸모가 없습니다.

데이터보다 인덱스에 대한 스토리지가 이미 많기 때문에 기존 15 개의 NC 인덱스에 중복성이 있는지 확인할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.