সূচক অপারেটরের জন্য সন্ধান করুন


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%) এর একটি আনুমানিক অপারেটর ব্যয় দেখায় :

পরিকল্পনা

ব্যয়টি ব্যবহৃত কার্ডিনালিটি অনুমানের মডেলের চেয়ে আলাদা।

এটি আনুমানিক সিপিইউ খরচ এবং আনুমানিক I / O খরচের একটি সহজ সংযোজন নয় । উভয়ই নির্ধারণের আনুমানিক সংখ্যা দ্বারা গুণিত সূচকের সন্ধানের একটি কার্যকর করার জন্য খরচ হয় না ।

এই ব্যয় সংখ্যাটি কীভাবে পৌঁছেছে?

উত্তর:


10

সম্পূর্ণ মূল্য ব্যয় যুক্তি যুক্ত জটিল, তবে তুলনামূলকভাবে সহজ ক্ষেত্রে প্রশ্নটিতে:

ইনপুট

  1. অপারেটর কতবার মৃত্যুদন্ড কার্যকর করা
    হয় এটি নির্বাহের আনুমানিক সংখ্যা : 504

  2. Cardinality (সারির মোট সংখ্যা) সূচক
    দ্য 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;

ডিবি <> বেহালার

ফলাফল


দুর্দান্ত কাজ, আনুমানিক ব্যয়টি কোথা থেকে এসেছে, কোন ভেরিয়েবলগুলি এটি প্রভাবিত করে এবং কোন অনুপাতে। এটি কি সমস্ত এসকিউএল সার্ভার সংস্করণের জন্য মেকানিক? অবিচ্ছিন্ন কিছু পরিবর্তন হতে পারে?
ইজলো

2
আমার সচেতন হিসাবে ২০০৫ সাল থেকে দামের এই দিকটি পরিবর্তন হয়নি।
পল হোয়াইট 9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.