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


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.