इंडेक्स सीक ऑपरेटर की लागत


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%) को दर्शाती है :

योजना

लागत उपयोग में कार्डिनैलिटी आकलन मॉडल से स्वतंत्र है।

यह अनुमानित CPU लागत और अनुमानित I / O लागत का एक साधारण जोड़ नहीं है । न तो यह सूचकांक की एक निष्पादन के लिए लागत है जो अनुमानों की अनुमानित संख्या से कई गुना अधिक है ।

यह कॉस्ट नंबर किस तरह से आया है?

जवाबों:


10

पूर्ण लागत व्युत्पत्ति तर्क जटिल है, लेकिन प्रश्न में अपेक्षाकृत सरल मामले के लिए:

इनपुट

  1. ऑपरेटर द्वारा निष्पादित किए जाने की संख्या
    यह अनुमानों की अनुमानित संख्या है : 504

  2. सूचकांक
    में कार्डिनैलिटी (पंक्तियों की कुल संख्या) इंडेक्स सीक ऑपरेटर की टेबलकार्डिनिटी संपत्ति यह प्रदान करती है: 113,447

  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;

डाटाबेस <> बेला

परिणाम


महान काम, यह जानना अच्छा है कि अनुमानित लागत कहां से आती है, कौन से चर इसे प्रभावित करते हैं और किस अनुपात में। यह सभी SQL सर्वर संस्करणों के लिए मैकेनिक है? शायद स्थिरांक में कुछ बदलाव?
एजेलो

2
लागत का यह पहलू 2005 से अब तक नहीं बदला है जहां तक ​​मैं जागरूक हूं।
पॉल व्हाइट 9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.