단계 내 통계 값의> = 및>에 대한 카디널리티 추정


9

SQL Server가 SQL Server 2014의 '보다 큼'및 '보다 큼'where 절을 평가하는 방법을 이해하려고합니다.

예를 들어 카디널리티 추정이 단계에 도달하면 이해합니다.

    select * from charge where charge_dt >= '1999-10-13 10:47:38.550'

카디널리티 추정은 6672이며 32 (EQ_ROWS) + 6624 (RANGE_ROWS) + 16 (EQ_ROWS) = 6672 (아래 스크린 샷의 히스토그램)로 쉽게 계산할 수 있습니다.

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

하지만 내가 할 때

    select * from charge where charge_dt >= '1999-10-13 10:48:38.550' 

(시간이 10:48로 증가하여 단계가 아님)

추정치는 4844.13입니다.

어떻게 계산합니까?

답변:


9

쿼리 술어 간격이 부분적으로 포함 하는 히스토그램 단계를 처리하는 방법을 결정하는 데 어려움이 있습니다. 술어 범위에 포함되는 전체 히스토그램 단계는 문제에서 언급 한 것처럼 사소합니다.

레거시 카디널리티 추정기

F = 쿼리 술어에 포함 된 단계 범위의 분수 (0과 1 사이).

기본 아이디어는 F(선형 보간)을 사용하여 술어가 포함하는 단계 내 고유 값의 수를 판별하는 것입니다. 이 결과에 고유 값당 평균 행 수를 곱하고 (균일 함 가정) 단계를 동일한 행을 추가하면 카디널리티 추정값이 제공됩니다.

카디널리티 = EQ_ROWS + (AVG_RANGE_ROWS * F * DISTINCT_RANGE_ROWS)

같은 공식에 사용되는 >>=기존 CE에서.

새로운 카디널리티 추정기

새로운 CE는 이전 알고리즘을 약간 수정하여 >와를 구분 >=합니다.

촬영 >우선, 공식은 :

카디널리티 = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS-1)))

들어 >=그 것이다 :

카디널리티 = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS-1)) + 1))

+ 1비교가 평등을 포함 할 때, 일치 (포함 된 가정) 가정 것을 반영한다.

질문 예에서 F다음과 같이 계산할 수 있습니다.

DECLARE 
    @Q datetime = '1999-10-13T10:48:38.550',
    @K1 datetime = '1999-10-13T10:47:38.550',
    @K2 datetime = '1999-10-13T10:51:19.317';

DECLARE
    @QR float = DATEDIFF(MILLISECOND, @Q, @K2), -- predicate range
    @SR float = DATEDIFF(MILLISECOND, @K1, @K2) -- whole step range

SELECT
    F = @QR / @SR;

결과는 0.728219019233034 입니다. >=다른 알려진 값으로 수식에 연결하면 다음 과 같습니다.

카디널리티 = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS-1)) + 1))
            = 16 + (16.1956 * ((0.728219019233034 * (409-1)) + 1))
            = 16 + (16.1956 * ((0.728219019233034 * 408) + 1))
            = 16 + (16.1956 * (297.113359847077872 + 1))
            = 16 + (16.1956 * 298.113359847077872)
            = 16 + 4828.1247307393343837632
            = 4844.1247307393343837632
            = 4844.12473073933 (정밀도 부동)

이 결과는 질문에 표시된 4844.13의 추정치와 일치합니다.

레거시 CE를 사용하는 동일한 쿼리 (예 : 추적 플래그 9481 사용)는 다음을 추정해야합니다.

카디널리티 = EQ_ROWS + (AVG_RANGE_ROWS * F * DISTINCT_RANGE_ROWS)
            = 16 + (16.1956 * 0.728219019233034 * 409)
            = 16 + 4823.72307468722
            = 4839.72307468722

추정치는 레거시 CE >와 동일 하고 >=사용합니다.


4

필터가 "보다 큼"또는 "보다 작음"이면 행을 추정하기위한 공식이 약간 구겨 지지만 도달 할 수있는 숫자입니다.

숫자들

193 단계를 사용하여 관련 번호는 다음과 같습니다.

RANGE_ROWS = 6624

EQ_ROWS = 16

AVG_RANGE_ROWS = 16.1956

이전 단계의 RANGE_HI_KEY = 1999-10-13 10 : 47 : 38.550

현재 단계의 RANGE_HI_KEY = 1999-10-13 10 : 51 : 19.317

WHERE 절의 값 = 1999-10-13 10 : 48 : 38.550

공식

1) 두 범위 hi 키 사이의 ms를 찾으십시오.

SELECT DATEDIFF (ms, '1999-10-13 10:47:38.550', '1999-10-13 10:51:19.317')

결과는 220767ms입니다.

2) 행 수 조정

밀리 초당 행을 찾아야하지만 그렇게하기 전에 RANGE_ROWS에서 AVG_RANGE_ROWS를 빼야합니다.

6624-16.1956 = 6607.8044 행

3) 조정 된 행 수로 ms 당 행을 계산하십시오.

6607.8044 행 / 220767ms = ms 당 .0299311 행

4) WHERE 절의 값과 현재 단계 RANGE_HI_KEY 사이의 ms를 계산하십시오.

SELECT DATEDIFF (ms, '1999-10-13 10:48:38.550', '1999-10-13 10:51:19.317')

이것은 우리에게 160767ms를 제공합니다.

5) 초당 행을 기준으로이 단계에서 행을 계산하십시오.

.0299311 행 / ms * 160767ms = 4811.9332 행

6) 이전에 AVG_RANGE_ROWS를 뺀 방법을 기억하십니까? 다시 추가 할 시간입니다. 초당 행과 관련된 숫자를 계산 했으므로 EQ_ROWS도 안전하게 추가 할 수 있습니다.

4811.9332 + 16.1956 + 16 = 4844.1288

반올림하면 4844.13입니다.

공식 테스트

ms 당 행을 계산하기 전에 AVG_RANGE_ROWS를 빼는 이유에 대한 기사 또는 블로그 게시물을 찾을 수 없습니다. 나는 이었다 문자 그대로 - 그들이 추정하지만 마지막 밀리 초에서 회계 확인할 수.

WideWorldImporters 데이터베이스를 사용하여 증분 테스트를 수행하고 1x AVG_RANGE_ROWS가 갑자기 고려되는 단계가 끝날 때까지 행 추정치 감소가 선형 임을 발견했습니다.

다음은 샘플 쿼리입니다.

SELECT PickingCompletedWhen
FROM Sales.Orders
WHERE PickingCompletedWhen >= '2016-05-24 11:00:01.000000'

PickingCompletedWhen에 대한 통계를 업데이트 한 다음 히스토그램을 얻었습니다.

DBCC SHOW_STATISTICS([sales.orders], '_WA_Sys_0000000E_44CA3770')

_WA_Sys_0000000E_44CA3770에 대한 히스토그램 (마지막 3 단계)

RANGE_HI_KEY에 접근 할 때 예상 행이 어떻게 감소하는지 확인하기 위해 전체 단계에서 샘플을 수집했습니다. 감소는 선형 적이지만 AVG_RANGE_ROWS 값과 동일한 행 수가 추세의 일부가 아닌 것처럼 작동합니다. 샘플 데이터, 특히 그래프에서 볼 수 있습니다.

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

RANGE_HI_KEY에 도달 한 다음 마지막 AVG_RANGE_ROWS 청크에서 마지막으로 BOOM이 차감 될 때까지 행이 꾸준히 감소합니다. 그래프에서도 쉽게 확인할 수 있습니다.

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

요약하면, AVG_RANGE_ROWS의 홀수 처리로 행 추정 계산이 더 복잡해 지지만 항상 CE가 수행하는 작업을 조정할 수 있습니다.

지수 백 오프는 어떻습니까?

지수 백 오프는 새로운 단일 카디널리티 추정기가 여러 단일 열 통계를 사용할 때 더 나은 추정치를 얻기 위해 사용하는 방법입니다 (SQL Server 2014 기준). 이 질문은 단일 열 통계에 관한 것이 었으므로 EB 수식과 관련이 없습니다.

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