인덱스 탐색 운영자 비용


9

의 경우 에서는 AdventureWorks 샘플 데이터베이스 쿼리 아래 :

SELECT 
    P.ProductID, 
    CA.TransactionID
FROM Production.Product AS P
CROSS APPLY
(
    SELECT TOP (1)
        TH.TransactionID
    FROM Production.TransactionHistory AS TH
    WHERE
        TH.ProductID = P.ProductID
    ORDER BY 
        TH.TransactionID DESC
) AS CA;

실행 계획 쇼는 예상 연산자 비용0.0850383 을 위해 (93 %) 색인 탐색 :

계획

비용은 사용중인 카디널리티 추정 모델과 무관합니다.

Estimated CPU CostEstimated I / O Cost 의 단순한 추가가 아닙니다 . Index Seek 의 한 번의 실행 비용 과 예상 실행 횟수를 곱한 비용도 아닙니다 .

이 비용 번호는 어떻게 도착합니까?

답변:


10

전체 비용 도출 논리는 복잡하지만 질문에서 비교적 간단한 경우입니다.

입력

  1. 조작자가 실행 횟수
    이것은이다 처형 추정 번호 : 504

  2. 인덱스의 카디널리티 (총 행 수) Index Seek 연산자
    TableCardinality 속성은 다음을 제공합니다. 113,443

  3. 색인의 데이터 페이지 수 : 201
    이 수는 다음과 같은 여러 가지 방법으로 얻을 수 있습니다 sys.allocation_units.

    SELECT 
        AU.data_pages
    FROM sys.allocation_units AS AU
    JOIN sys.partitions AS P
        ON P.hobt_id = AU.container_id
    WHERE
        AU.[type_desc] = N'IN_ROW_DATA'
        AND P.[object_id] = OBJECT_ID(N'Production.TransactionHistory', N'U')
        AND P.index_id = 
            INDEXPROPERTY(P.[object_id], N'IX_TransactionHistory_ProductID', 'IndexID');
  4. 지수 의 밀도 (1 / 고유 한 값 ) : 0.002267574
    이는 지수 통계의 밀도 벡터에서 사용할 수 있습니다.

    DBCC SHOW_STATISTICS 
    (
        N'Production.TransactionHistory', 
        N'IX_TransactionHistory_ProductID'
    ) 
    WITH DENSITY_VECTOR;

    밀도

계산

-- Input numbers
DECLARE
    @Executions float = 504,
    @Density float = 0.002267574,
    @IndexDataPages float = 201,
    @Cardinality float = 113443;

-- SQL Server cost model constants
DECLARE
    @SeqIO float = 0.000740740740741,
    @RandomIO float = 0.003125,
    @CPUbase float = 0.000157,
    @CPUrow float = 0.0000011;

-- Computation
DECLARE
    @IndexPages float = CEILING(@IndexDataPages * @Density),
    @Rows float = @Cardinality * @Density,
    @Rebinds float = @Executions - 1e0;

DECLARE
    @CPU float = @CPUbase + (@Rows * @CPUrow),
    @IO float = @RandomIO + (@SeqIO * (@IndexPages - 1e0)),
    -- sample with replacement
    @PSWR float = @IndexDataPages * (1e0 - POWER(1e0 - (1e0 / @IndexDataPages), @Rebinds));

-- Cost components (no rewinds)
DECLARE
    @InitialCost float = @RandomIO + @CPUbase + @CPUrow,
    @RebindCPU float = @Rebinds * (1e0 * @CPUbase + @CPUrow),
    @RebindIO float = (1e0 / @Rows) * ((@PSWR - 1e0) * @IO);

-- Result
SELECT 
    OpCost = @InitialCost + @RebindCPU + @RebindIO;

db <> 바이올린

결과


대단한 일이지만 예상 비용이 어디에서 나오는지, 어떤 변수가 그에 영향을 미치는지, 어느 정도의 비율인지 아는 것이 좋습니다. 이것이 모든 SQL Server 버전의 메커니즘입니까? 상수에 약간의 변화가 있습니까?
EzLo

2
이 원가 계산 측면은 내가 아는 한 2005 년부터 변하지 않았습니다.
Paul White 9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.