Chỉ số tìm kiếm chi phí khai thác


9

Đối với truy vấn cơ sở dữ liệu mẫu AdventureWorks bên dưới:

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;

Kế hoạch thực hiện hiển thị Chi phí khai thác ước tính0,0850383 (93%) cho Chỉ số tìm kiếm :

kế hoạch

Chi phí độc lập với mô hình ước lượng cardinality đang sử dụng.

Nó không phải là một bổ sung đơn giản của Chi phí CPU ước tínhChi phí I / O ước tính . Đây cũng không phải là chi phí cho một lần thực hiện Chỉ số tìm kiếm nhân với số lần thực hiện ước tính .

Làm thế nào là số chi phí này đến?

Câu trả lời:


10

Logic dẫn xuất chi phí đầy đủ là phức tạp, nhưng đối với trường hợp tương đối đơn giản trong câu hỏi:

Đầu vào

  1. Số lần toán tử được thực thi
    Đây là Số lần thực hiện ước tính : 504

  2. Cardinality (tổng số hàng) trong chỉ mục
    các TableCardinality tài sản của Index Seek điều hành cung cấp cho này: 113.443

  3. Số lượng trang dữ liệu trong chỉ mục: 201
    Số này có thể được lấy theo nhiều cách, ví dụ từ 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. Mật độ (1 / giá trị riêng biệt ) của chỉ số: 0,002267574
    Điều này có sẵn trong vectơ mật độ của thống kê chỉ số:

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

    tỉ trọng

Tính toán

-- 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 <>

Kết quả


Công việc tuyệt vời, thật tuyệt khi biết chi phí ước tính đến từ đâu, biến nào ảnh hưởng đến nó và theo tỷ lệ nào. Đây có phải là cơ chế cho tất cả các phiên bản SQL Server không? Có lẽ một vài thay đổi trong hằng số?
EzLo

2
Khía cạnh chi phí này đã không thay đổi kể từ năm 2005 theo như tôi biết.
Paul White 9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.