고유 인덱스 스캔 후에 집계 연산자가 사용 된 이유


15

nullable 값으로 필터링 된 고유 인덱스가있는 테이블이 있습니다. 쿼리 계획에는 distinct가 사용됩니다. 이것에 대한 이유가 있습니까?

USE tempdb

CREATE TABLE T1( Id INT NOT NULL  IDENTITY PRIMARY KEY ,F1 INT , F2 INT )
go
CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL 
GO
INSERT INTO  T1(f1,F2) VALUES(1,1),(1,2),(2,1)

SELECT DISTINCT   F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL 
SELECT  F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL  

쿼리 계획 : 여기에 이미지 설명을 입력하십시오

답변:


15

이것은 알려진 SQL Server 쿼리 최적화 프로그램 제한 사항입니다. Microsoft에보고되었지만 Connect 항목 (더 이상 사용할 수 없음)이 닫히지 않음

필터링 된 인덱스를 사용한 옵티 마이저 제한 에서 작성한 내용을 포함하여이 제한의 추가 결과 가 있습니다. 요약은 다음과 같습니다.

이 게시물에서는 필터링 된 인덱스에 대한 두 가지 중요한 최적화 제한 사항을 중점적으로 설명합니다.

  • 필터링 된 인덱스와 일치시키기 위해 중복 결합 술어가 필요할 수 있습니다.
  • 필터링 된 고유 인덱스는 고유 정보를 옵티 마이저에 제공하지 않습니다.

어떤 경우에는 모든 쿼리에 중복 술어를 추가하는 것이 실용적 일 수 있습니다. 대안은 원하는 암시 적 술어를 색인화되지 않은보기로 캡슐화하는 것입니다. 옵티마이 저가 약간 더 나은 병합 조인 계획을 찾을 수 있어야하더라도이 게시물의 해시 일치 계획은 기본 계획보다 훨씬 낫습니다. 때로는 뷰를 인덱싱하고 NOEXPAND힌트를 사용해야 할 수도 있습니다 (어쨌든 Standard Edition 인스턴스에 필요). 또 다른 상황에서, 이들 접근법 중 어느 것도 적합하지 않을 것이다.

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