Sys.query_store_plan দিয়ে এলিমিনেশন কাজে কেন যোগদান করবেন না?


10

নীচে ক্যোয়ারী স্টোরের সাথে সম্মুখীন পারফরম্যান্স সমস্যার একটি সরলীকরণ:

CREATE TABLE #tears
(
    plan_id bigint NOT NULL
);

INSERT #tears (plan_id) 
VALUES (1);

SELECT
    T.plan_id
FROM #tears AS T
LEFT JOIN sys.query_store_plan AS QSP
    ON QSP.plan_id = T.plan_id;

plan_idকলামের প্রাথমিক কী হচ্ছে নথিভুক্ত করা sys.query_store_planকিন্তু সঞ্চালনের পরিকল্পনা ব্যবহার করে না বর্জন যোগদানের যেমন আশা করা যেতে হবে:

  1. ডিএমভি থেকে কোনও বৈশিষ্ট্য অনুমান করা হচ্ছে না।
  2. ডিএমভি প্রাথমিক কী plan_idঅস্থায়ী সারণী থেকে সারিগুলি নকল করতে পারে না
  3. LEFT JOINব্যবহৃত হয়, সুতরাং কোনও সারি Tমুছে ফেলা যায় না।

হত্যা পরিকল্পনা

পরিকল্পনা গ্রাফিক

এটি কেন এবং এখানে যোগদানের বিলোপ পাওয়ার জন্য কী করা যেতে পারে?

উত্তর:


16

ডকুমেন্টেশনটি কিছুটা বিভ্রান্তিকর। ডিএমভি হ'ল একটি উপাদানহীন দৃশ্য এবং এর মতো প্রাথমিক কী নেই। অন্তর্নিহিত সংজ্ঞাগুলি কিছুটা জটিল তবে এর সরলিকৃত সংজ্ঞাটি sys.query_store_planহ'ল:

CREATE VIEW sys.query_store_plan AS
SELECT
    PPM.plan_id
    -- various other attributes
FROM sys.plan_persist_plan_merged AS PPM
LEFT JOIN sys.syspalvalues AS P
    ON P.class = 'PFT' 
    AND P.[value] = plan_forcing_type;

তদ্ব্যতীত, sys.plan_persist_plan_mergedএটিও একটি দৃশ্য, যদিও এর সংজ্ঞাটি দেখার জন্য একজনকে ডেডিকেটেড অ্যাডমিনিস্ট্রেটর সংযোগের মাধ্যমে সংযুক্ত হওয়া দরকার। আবার সরলীকৃত:

CREATE VIEW sys.plan_persist_plan_merged AS   
SELECT     
    P.plan_id as plan_id,    
    -- various other attributes
FROM sys.plan_persist_plan P 
    -- NOTE - in order to prevent potential deadlock
    -- between QDS_STATEMENT_STABILITY LOCK and index locks   
    WITH (NOLOCK) 
LEFT JOIN sys.plan_persist_plan_in_memory PM
    ON P.plan_id = PM.plan_id;

সূচকগুলি sys.plan_persist_planহল:

╔════════════════════════╦════════════════════════ ══════════════╦═════════════╗
║ সূচক_নাম ║ সূচক_ বিবরণ ║ সূচক_কিজ ║ ║
╠════════════════════════╬════════════════════════ ══════════════╬═════════════╣
║ প্ল্যান_পার্স্টিস্ট_প্ল্যান_সিডেক্স ║ গোষ্ঠীযুক্ত, অনন্য প্রাইমারিতে অবস্থিত ║ প্ল্যান_আইডি ║
║ প্ল্যান_পার্সিস্ট_প্লান_আইডিএক্সএক্স ║ প্রাইমারিতে অবিচ্ছিন্ন অবস্থিত ║ ক্যোয়ারী_আইডি (-) ║
╚════════════════════════╩════════════════════════ ══════════════╩═════════════╝

তাই plan_idঅনন্য হতে সীমাবদ্ধ sys.plan_persist_plan

এখন, sys.plan_persist_plan_in_memoryএকটি স্ট্রিমিং টেবিল-মূল্যবান ফাংশন, কেবলমাত্র অভ্যন্তরীণ মেমরি স্ট্রাকচারগুলিতে রাখা ডেটার একটি টবুলার ভিউ উপস্থাপন করে। সেই হিসাবে এটির কোনও অনন্য বাধা নেই।

হার্টে, সম্পাদিত ক্যোয়ারী তাই সমান:

DECLARE @t1 table (plan_id integer NOT NULL);
DECLARE @t2 table (plan_id integer NOT NULL UNIQUE CLUSTERED);
DECLARE @t3 table (plan_id integer NULL);

SELECT 
    T1.plan_id
FROM @t1 AS T1 
LEFT JOIN
(
    SELECT 
        T2.plan_id
    FROM @t2 AS T2
    LEFT JOIN @t3 AS T3 
        ON T3.plan_id = T2.plan_id
) AS Q1
    ON Q1.plan_id = T1.plan_id;

... যা যোগদান নির্মূলের উত্পাদন করে না:

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

ইস্যুটির মূল দিকে পৌঁছে, সমস্যাটি হ'ল অভ্যন্তরীণ কোয়েরি:

DECLARE @t2 table (plan_id integer NOT NULL UNIQUE CLUSTERED);
DECLARE @t3 table (plan_id integer NULL);

SELECT 
    T2.plan_id
FROM @t2 AS T2
LEFT JOIN @t3 AS T3 
    ON T3.plan_id = T2.plan_id;

... স্পষ্টতই বাম জোড়ার ফলে সারিগুলি @t2অনুলিপি হতে পারে কারণ @t3এর কোনও স্বতন্ত্রতা বাধা নেই plan_id। সুতরাং, যোগদানটি বাদ দেওয়া যাবে না:

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

এটি কার্যকর করার জন্য, আমরা পরিষ্কারভাবে অপ্টিমাইজারকে বলতে পারি যে আমাদের কোনও সদৃশ plan_idমান প্রয়োজন নেই:

DECLARE @t2 table (plan_id integer NOT NULL UNIQUE CLUSTERED);
DECLARE @t3 table (plan_id integer NULL);

SELECT DISTINCT
    T2.plan_id
FROM @t2 AS T2
LEFT JOIN @t3 AS T3 
    ON T3.plan_id = T2.plan_id;

বাহিরের যোগটি @t3এখন মুছে ফেলা যায়:

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

আসল ক্যোয়ারিতে এটি প্রয়োগ করা:

SELECT DISTINCT
    T.plan_id
FROM #tears AS T
LEFT JOIN sys.query_store_plan AS QSP
    ON QSP.plan_id = T.plan_id;

সমানভাবে, আমরা এর GROUP BY T.plan_idপরিবর্তে যুক্ত করতে পারি DISTINCT। যাইহোক, অপ্টিমাইজার এখন plan_idনীড়যুক্ত দর্শনগুলির মাধ্যমে সমস্তভাবে গুণাবলীর বিষয়ে সঠিকভাবে যুক্তি দেখাতে পারে এবং উভয় বাহ্যিক যোগদানকে পছন্দসইভাবে বাদ দিতে পারে:

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

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

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