SQL Server 2014 COUNT (DISTINCT x)는 열 x에 대한 통계 밀도 벡터를 무시합니다.


15

A에 대한 COUNT(DISTINCT)갖는다 ~ 10 억 개 고유 값, 난 단지 ~ 300 만 행이있을 것으로 추정 해시 집계와 쿼리 계획을 얻고있다.

왜 이런 일이 발생합니까? SQL Server 2012는 적절한 견적을 제공하므로 SQL Server 2014의 버그로 Connect에 대해보고해야합니까?

쿼리와 잘못된 추정

-- Actual rows: 1,011,719,166
-- SQL 2012 estimated rows: 1,079,130,000 (106% of actual)
-- SQL 2014 estimated rows: 2,980,240 (0.29% of actual)
SELECT COUNT(DISTINCT factCol5)
FROM BigFactTable
OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE

-- Stats for the factCol5 column show that there are ~1 billion distinct values
-- This is a good estimate, and it appears to be what the SQL 2012 CE uses
DBCC SHOW_STATISTICS (BigFactTable, _WA_Sys_00000005_24927208)
--All density   Average Length  Columns
--9.266754E-10  8               factCol5
SELECT 1 / 9.266754E-10
-- 1079126520.46229

쿼리 계획

여기에 이미지 설명을 입력하십시오

전체 스크립트

다음은 통계 전용 데이터베이스를 사용하여 상황을 완전히 재현 한 것입니다 .

내가 지금까지 시도한 것

관련 항목에 대한 통계를 조사한 결과 밀도 벡터에 약 11 억 개의 고유 값이 표시됩니다. SQL Server 2012는이 추정치를 사용하여 적절한 계획을 수립합니다. 놀랍게도 SQL Server 2014는 통계에서 제공하는 매우 정확한 추정치를 무시하고 대신 훨씬 낮은 추정치를 사용합니다. 이렇게하면 메모리가 거의 예약되지 않고 tempdb에 유출되는 훨씬 느린 계획이 생성됩니다.

추적 플래그를 시도했지만 4199상황이 해결되지 않았습니다. 마지막으로, 이 기사의(3604, 8606, 8607, 8608, 8612) 후반부에서 설명한 것처럼 추적 플래그 조합을 통해 옵티 마이저 정보를 파고 들었습니다 . 그러나 최종 출력 트리에 나타날 때까지 잘못된 추정치를 설명하는 정보를 볼 수 없었습니다.

연결 문제

이 질문에 대한 답변을 바탕으로 Connect 에서 문제 로 제기했습니다.

답변:


14

카디널리티 추정이 도출되는 방식은 확실히 반 직관적 인 것 같습니다. 고유 카운트 계산 (확장 이벤트 또는 추적 플래그 2363 및 3604로 볼 수 있음)은 다음과 같습니다.

통계 도출

캡을 확인하십시오. 이것의 일반적인 논리는 매우 합리적이지만 (더 뚜렷한 값은있을 수는 없지만) 캡은 샘플링 된 다중 열 통계 에서 적용됩니다 .

DBCC SHOW_STATISTICS 
    (BigFactTable, [PK_BigFactTable])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

PK 통계

이는 Col5 수준 3.35544E-07의 밀도 벡터로 3,439,431,721에서 샘플링 된 2,980,235 행을 보여줍니다. 그 역수는 실제 수학을 사용하여 2,980,240으로 반올림 된 2,980,235의 많은 고유 값을 제공합니다.

이제 표본 통계가 주어지면 모델이 구별 값의 수에 대해 어떤 가정을해야하는지에 대한 의문이 제기됩니다. 나는 그것이 외삽되기를 기대하지만 그것은 이루어지지 않았으며 아마도 의도적으로 이루어졌습니다.

더 직관적으로, 나는 다중 열 통계를 사용하는 대신 Col5의 밀도를 볼 것이라고 기대하지만 (그렇지는 않습니다) :

DBCC SHOW_STATISTICS 
    (BigFactTable, [_WA_Sys_00000005_24927208])
WITH
    STAT_HEADER, 
    DENSITY_VECTOR;

Col5 통계

여기 밀도는 상호 그중 9.266754E-10 1,079,126,528 .

그 동안 명백한 한 가지 해결 방법은 전체 스캔으로 다중 열 통계를 업데이트하는 것입니다. 다른 하나는 원래 카디널리티 추정기를 사용하는 것입니다.

SQL 2014 샘플링 된 다중 열 통계 를 연 Connect 항목 은 선행이 아닌 열에 대해보다 정확한 단일 열 통계를 재정의 합니다.는 SQL Server 2017에 대해 고정 으로 표시 됩니다.

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