একটি একক সারি অপরিবর্তিত রাখার সময় আমি কীভাবে একটি অপ্রয়োজনীয় সমান্তরাল শাখা থেকে মুক্তি পেতে পারি?


9

নিম্নলিখিত কোয়েরিতে বিবেচনা করুন যা কয়েকটি মুষ্টিমেয় স্কেলারের সমষ্টিগুলিকে আনপিবট করে:

SELECT A, B
FROM (
    SELECT 
      MAX(CASE WHEN ID = 1 THEN 1 ELSE 0 END) VAL1
    , MAX(CASE WHEN ID = 2 THEN 1 ELSE 0 END) VAL2
    , MAX(CASE WHEN ID = 3 THEN 1 ELSE 0 END) VAL3
    , MAX(CASE WHEN ID = 4 THEN 1 ELSE 0 END) VAL4
    , MAX(CASE WHEN ID = 5 THEN 1 ELSE 0 END) VAL5
    , MAX(CASE WHEN ID = 6 THEN 1 ELSE 0 END) VAL6
    , MAX(CASE WHEN ID = 7 THEN 1 ELSE 0 END) VAL7
    , MAX(CASE WHEN ID = 16 THEN 1 ELSE 0 END) VAL16
    FROM dbo.PARALLEL_ZONE_REPRO
) q
UNPIVOT(B FOR A IN (
    VAL1
    ,VAL2
    ,VAL3
    ,VAL4
    ,VAL5
    ,VAL6
    ,VAL7
    ,VAL16
)) U
OPTION (MAXDOP 4);

এসকিউএল সার্ভারে, আমি দুটি সমান্তরাল শাখা নিয়ে একটি পরিকল্পনা পেয়েছি। বাম সমান্তরাল শাখা আমার কাছে জায়গা থেকে দূরে অনুভব করে। অপ্টিমাইজারটির গ্যারান্টি রয়েছে যে বিশ্বব্যাপী স্কেলার সমষ্টি থেকে কেবল একটি একক সারি আউটপুট থাকবে, তবুও এর প্যারেন্ট অপারেটরটি গোলাকার রবিন বিভাজন সহ একটি বিতরণ স্ট্রিম:

গোলাকার রবিন

যখন আমি কোয়েরিটি সম্পাদন করি তখন প্রত্যাশার মতো সমস্ত সারি একক থ্রেডে যায়। এই কোয়েরিতে কোনও পারফরম্যান্স সমস্যা নেই, তবে ক্যোয়ারিতে ম্যাক্সডুপের সাথে 8 টি সমান্তরাল থ্রেড সংরক্ষিত রয়েছে Again আবার, আমি অনুভব করি যে এটির জায়গাটি বাইরে। সমান্তরাল উভয় শাখার পক্ষে একই সময়ে কার্যকর করা অসম্ভব। আমি অপ্রয়োজনীয় শ্রমিকের থ্রেড সংরক্ষণগুলি এড়াতে চাই কারণ আমার টিএফ 2467 সক্ষম হয়েছে যা শিডিয়ুলার প্রতি কর্মী থ্রেডের সংখ্যা দেখতে শিডিয়ুলিং অ্যালগরিদম পরিবর্তন করে।

টেবিল স্ক্যান এবং স্থানীয় সমষ্টি সহ ঠিক একটি সমান্তরাল শাখা থাকা কি ক্যোরিয়াকে পুনরায় লেখা সম্ভব? উদাহরণস্বরূপ, নীচের সাধারণ আকারের সাথে আমি ভাল থাকব তবে আমি নীস্টযুক্ত লুপটি ক্রমিক জোনে চালিত করতে চাই:

এখানে চিত্র বর্ণনা লিখুন

অ্যাপ্লিকেশন কারণগুলির জন্য - আমি দৃ query়ভাবে এই ক্যোয়ারিকে অংশগুলিতে বিভক্ত করা এড়াতে পছন্দ করি। যদি ইচ্ছা হয় তবে আপনি এখানে আসল জিজ্ঞাসা পরিকল্পনাটি দেখতে পারেন । আপনি যদি ঘরে বসে খেলতে চান তবে কোয়েরিতে ব্যবহৃত টেবিলটি তৈরি করতে এখানে টি-এসকিউএল রয়েছে:

DROP TABLE IF EXISTS dbo.PARALLEL_ZONE_REPRO;

CREATE TABLE dbo.PARALLEL_ZONE_REPRO (
    ID BIGINT,
    FILLER VARCHAR(100)
);

INSERT INTO dbo.PARALLEL_ZONE_REPRO WITH (TABLOCK)
SELECT
  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) % 15
, REPLICATE('Z', 100)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

উত্তর:


8

নীচের সমস্ত সত্য হলে আমি সিরিয়াল লুপের সাথে কাঙ্ক্ষিত পরিকল্পনার আকার পেতে সক্ষম হয়েছি:

  • এর পরিবর্তে একটি APPLYবা CROSS JOINব্যবহৃত হয়UNPIVOT
  • APPLYকোন বাইরের রেফারেন্স রয়েছে
  • এর মধ্যে সারিগুলির উত্স APPLYহ'ল একটি সারণির বিপরীতে একটি সারণীর মান নির্মাতা

উদাহরণস্বরূপ, এটি করার একটি উপায় এখানে রয়েছে:

SELECT A, B
FROM 
(
    SELECT A
    , MAX(
        CASE
            WHEN A = 'VAL1' THEN VAL1 
            WHEN A = 'VAL2' THEN VAL2
            WHEN A = 'VAL3' THEN VAL3
            WHEN A = 'VAL4' THEN VAL4
            WHEN A = 'VAL5' THEN VAL5
            WHEN A = 'VAL6' THEN VAL6
            WHEN A = 'VAL7' THEN VAL7
            WHEN A = 'VAL16' THEN VAL16
            ELSE NULL
        END
    ) B
    FROM (
         SELECT 
           MAX(CASE WHEN ID = 1 THEN 1 ELSE 0 END) VAL1
         , MAX(CASE WHEN ID = 2 THEN 1 ELSE 0 END) VAL2
         , MAX(CASE WHEN ID = 3 THEN 1 ELSE 0 END) VAL3
         , MAX(CASE WHEN ID = 4 THEN 1 ELSE 0 END) VAL4
         , MAX(CASE WHEN ID = 5 THEN 1 ELSE 0 END) VAL5
         , MAX(CASE WHEN ID = 6 THEN 1 ELSE 0 END) VAL6
         , MAX(CASE WHEN ID = 7 THEN 1 ELSE 0 END) VAL7
         , MAX(CASE WHEN ID = 16 THEN 1 ELSE 0 END) VAL16
         FROM dbo.PARALLEL_ZONE_REPRO
    ) q
    CROSS APPLY (
        VALUES ('VAL1'), ('VAL2'), ('VAL3'), ('VAL4'),
        ('VAL5'), ('VAL6'), ('VAL7'), ('VAL16') 
    ) ca (A)
    GROUP BY A
) q
WHERE q.B IS NOT NULL
OPTION (MAXDOP 4);

আমি কেবল একটি সমান্তরাল শাখার সাথে দাবি অনুসারে কাঙ্ক্ষিত পরিকল্পনা পরিকল্পনার আকার পেয়েছি:

এখানে চিত্র বর্ণনা লিখুন

আমি চেষ্টা করেছিলাম এমন আরও অনেক জিনিস যা কার্যকর হয়নি। এই উত্তরটি অতৃপ্তিযুক্ত যে এটি কেন কাজ করে তা আমি জানি না এবং এটি এসকিউএল সার্ভারের ভবিষ্যতের সংস্করণে কাজ নাও করতে পারে তবে এটি আমার সমস্যার সমাধান করে।


8

সমান্তরাল উভয় শাখার পক্ষে একই সময়ে কার্যকর করা অসম্ভব।

পরিকল্পনার বাম প্রান্তে কার্যকর করা শুরু হয় । যখন টেবিল স্ক্যান শাখাটি চালু থাকে তখন নেস্টেড লুপস শাখাটি চালু হয় (তথ্যের জন্য অপেক্ষা করে) running এটি অনিবার্য । উভয় শাখা একই সাথে সক্রিয়, সুতরাং এসকিউএল সার্ভার এই পরিকল্পনার জন্য 2 * ডপ কর্মী সংরক্ষণ করবে ।

একটি শক্ত সমাধানের জন্য, আপনি একটি টেবিলের মূল্যবান ফাংশনে পিভটটি রাখতে পারেন:

CREATE OR ALTER FUNCTION dbo.PivotPZR()
RETURNS @R table 
(
    VAL1 bigint NOT NULL, VAL2 bigint NOT NULL,
    VAL3 bigint NOT NULL, VAL4 bigint NOT NULL,
    VAL5 bigint NOT NULL, VAL6 bigint NOT NULL,
    VAL7 bigint NOT NULL, VAL16 bigint NOT NULL
)
WITH SCHEMABINDING AS
BEGIN
    DECLARE 
        @Val1 bigint, @Val2 bigint, @Val3 bigint, @Val4 bigint,
        @Val5 bigint, @Val6 bigint, @Val7 bigint, @Val16 bigint;

    -- Can use parallelism
    SELECT
        @Val1 = MAX(CASE WHEN PZR.ID = 1 THEN 1 ELSE 0 END),
        @Val2 = MAX(CASE WHEN PZR.ID = 2 THEN 1 ELSE 0 END),
        @Val3 = MAX(CASE WHEN PZR.ID = 3 THEN 1 ELSE 0 END),
        @Val4 = MAX(CASE WHEN PZR.ID = 4 THEN 1 ELSE 0 END),
        @Val5 = MAX(CASE WHEN PZR.ID = 5 THEN 1 ELSE 0 END),
        @Val6 = MAX(CASE WHEN PZR.ID = 6 THEN 1 ELSE 0 END),
        @Val7 = MAX(CASE WHEN PZR.ID = 7 THEN 1 ELSE 0 END),
        @Val16 = MAX(CASE WHEN PZR.ID = 16 THEN 1 ELSE 0 END)
    FROM dbo.PARALLEL_ZONE_REPRO AS PZR;

    -- Single result row
    INSERT @R
        (VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL16)
    VALUES
        (@Val1, @Val2, @Val3, @Val4, @Val5, @Val6, @Val7, @Val16);

    RETURN;
END;

তারপরে কোয়েরিটি আবার লিখুন:

SELECT
    U.A,
    U.B
FROM dbo.PivotPZR() AS PP
UNPIVOT
(
    B FOR A IN (VAL1, VAL2 ,VAL3 ,VAL4, VAL5 ,VAL6 ,VAL7 ,VAL16)
) AS U;

ফাংশনটি পছন্দসই হিসাবে একটি একক শাখার সাথে সমান্তরালতা ব্যবহার করে:

ফাংশন পরিকল্পনা

শীর্ষ স্তরের কার্যকরকরণ পরিকল্পনাটি হ'ল:

শীর্ষ স্তরের ক্যোয়ারী

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