필터가 "보다 큼"또는 "보다 작음"이면 행을 추정하기위한 공식이 약간 구겨 지지만 도달 할 수있는 숫자입니다.
숫자들
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')
RANGE_HI_KEY에 접근 할 때 예상 행이 어떻게 감소하는지 확인하기 위해 전체 단계에서 샘플을 수집했습니다. 감소는 선형 적이지만 AVG_RANGE_ROWS 값과 동일한 행 수가 추세의 일부가 아닌 것처럼 작동합니다. 샘플 데이터, 특히 그래프에서 볼 수 있습니다.
RANGE_HI_KEY에 도달 한 다음 마지막 AVG_RANGE_ROWS 청크에서 마지막으로 BOOM이 차감 될 때까지 행이 꾸준히 감소합니다. 그래프에서도 쉽게 확인할 수 있습니다.
요약하면, AVG_RANGE_ROWS의 홀수 처리로 행 추정 계산이 더 복잡해 지지만 항상 CE가 수행하는 작업을 조정할 수 있습니다.
지수 백 오프는 어떻습니까?
지수 백 오프는 새로운 단일 카디널리티 추정기가 여러 단일 열 통계를 사용할 때 더 나은 추정치를 얻기 위해 사용하는 방법입니다 (SQL Server 2014 기준). 이 질문은 단일 열 통계에 관한 것이 었으므로 EB 수식과 관련이 없습니다.