এক্সিকিউশন প্ল্যান ব্যবহার করে টি-এসকিউএল কোয়েরি কীভাবে অনুকূল করা যায়


15

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

আমি বেশিরভাগ টি-এসকিউএল করেছি, তবে আমার ক্যোয়ারীটি অনুকূল করে তুলতে এক্সিকিউশন প্ল্যানস ব্যবহার করা আমার জন্য একটি নতুন ক্ষেত্র এবং আমি কীভাবে এটি করব তা বুঝতে চেষ্টা করেছি। সুতরাং, যদি কেউ আমাকে এটিতে সহায়তা করতে পারে এবং কীভাবে এই কার্যকরকরণ পরিকল্পনাকে কীভাবে আরও অনুকূল করার জন্য অনুসন্ধানের উপায়গুলি খুঁজতে পারে তা ব্যাখ্যা করতে পারে তবে আমি চির কৃতজ্ঞ হব। অনুকূলিত করার জন্য আমার কাছে আরও অনেক প্রশ্ন রয়েছে - আমাকে এই প্রথমটির সাথে সাহায্য করার জন্য আমার কেবল একটি স্প্রিংবোর্ড দরকার।

এটি ক্যোয়ারী:

DECLARE @Param0 DATETIME     = '2013-07-29';
DECLARE @Param1 INT          = CONVERT(INT, CONVERT(VARCHAR, @Param0, 112))
DECLARE @Param2 VARCHAR(50)  = 'ABC';
DECLARE @Param3 VARCHAR(100) = 'DEF';
DECLARE @Param4 VARCHAR(50)  = 'XYZ';
DECLARE @Param5 VARCHAR(100) = NULL;
DECLARE @Param6 VARCHAR(50)  = 'Text3';

SET NOCOUNT ON

DECLARE @MyTableVar TABLE
(
    B_Var1_PK int,
    Job_Var1 varchar(512),
    Job_Var2 varchar(50)
)

INSERT INTO @MyTableVar (B_Var1_PK, Job_Var1, Job_Var2) 
SELECT B_Var1_PK, Job_Var1, Job_Var2 FROM [fn_GetJobs] (@Param1, @Param2, @Param3, @Param4, @Param6);

CREATE TABLE #TempTable
(
    TTVar1_PK INT PRIMARY KEY,
    TTVar2_LK VARCHAR(100),
    TTVar3_LK VARCHAR(50),
    TTVar4_LK INT,
    TTVar5 VARCHAR(20)
);

INSERT INTO #TempTable
SELECT DISTINCT
    T.T1_PK,
    T.T1_Var1_LK,
    T.T1_Var2_LK,
    MAX(T.T1_Var3_LK),
    T.T1_Var4_LK
FROM
    MyTable1 T
    INNER JOIN feeds.MyTable2 A ON A.T2_Var1 = T.T1_Var4_LK
    INNER JOIN @MyTableVar B ON B.Job_Var2 = A.T2_Var2 AND B.Job_Var1 = A.T2_Var3
GROUP BY T.T1_PK, T.T1_Var1_LK, T.T1_Var2_LK, T.T1_Var4_LK

-- This is the slow statement...
SELECT 
    CASE E.E_Var1_LK
        WHEN 'Text1' THEN T.TTVar2_LK + '_' + F.F_Var1
        WHEN 'Text2' THEN T.TTVar2_LK + '_' + F.F_Var2
        WHEN 'Text3' THEN T.TTVar2_LK
    END,
    T.TTVar4_LK,
    T.TTVar3_LK,
    CASE E.E_Var1_LK
        WHEN 'Text1' THEN F.F_Var1
        WHEN 'Text2' THEN F.F_Var2
        WHEN 'Text3' THEN T.TTVar5
    END,
    A.A_Var3_FK_LK,
    C.C_Var1_PK,
    SUM(CONVERT(DECIMAL(18,4), A.A_Var1) + CONVERT(DECIMAL(18,4), A.A_Var2))
FROM #TempTable T
    INNER JOIN TableA (NOLOCK) A ON A.A_Var4_FK_LK  = T.TTVar1_PK
    INNER JOIN @MyTableVar     B ON B.B_Var1_PK     = A.Job
    INNER JOIN TableC (NOLOCK) C ON C.C_Var2_PK     = A.A_Var5_FK_LK
    INNER JOIN TableD (NOLOCK) D ON D.D_Var1_PK     = A.A_Var6_FK_LK
    INNER JOIN TableE (NOLOCK) E ON E.E_Var1_PK     = A.A_Var7_FK_LK  
    LEFT OUTER JOIN feeds.TableF (NOLOCK) F ON F.F_Var1 = T.TTVar5
WHERE A.A_Var8_FK_LK = @Param1
GROUP BY
    CASE E.E_Var1_LK
        WHEN 'Text1' THEN T.TTVar2_LK + '_' + F.F_Var1
        WHEN 'Text2' THEN T.TTVar2_LK + '_' + F.F_Var2
        WHEN 'Text3' THEN T.TTVar2_LK
    END,
    T.TTVar4_LK,
    T.TTVar3_LK,
    CASE E.E_Var1_LK 
        WHEN 'Text1' THEN F.F_Var1
        WHEN 'Text2' THEN F.F_Var2
        WHEN 'Text3' THEN T.TTVar5
    END,
    A.A_Var3_FK_LK, 
    C.C_Var1_PK


IF OBJECT_ID(N'tempdb..#TempTable') IS NOT NULL
BEGIN
    DROP TABLE #TempTable
END
IF OBJECT_ID(N'tempdb..#TempTable') IS NOT NULL
BEGIN
    DROP TABLE #TempTable
END

আমি যেটি পেয়েছি তা হ'ল তৃতীয় বিবৃতি (ধীর বলে মন্তব্য করা) সেই অংশটি যা সবচেয়ে বেশি সময় নিচ্ছে। প্রায় তাত্ক্ষণিকভাবে ফেরার আগে দুটি বিবৃতি।

এক্সিকিউশন প্ল্যানটি এই লিঙ্কটিতে এক্সএমএল হিসাবে উপলব্ধ ।

ডান ক্লিক ক্লিক করুন এবং সংরক্ষণ করুন এবং তারপরে আপনার ব্রাউজারে খোলার চেয়ে এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরার বা অন্য কোনও দেখার সফ্টওয়্যার খুলুন।

সারণী বা ডেটা সম্পর্কে আমার কাছ থেকে যদি আপনার আরও কোনও তথ্যের প্রয়োজন হয় তবে দয়া করে জিজ্ঞাসা করতে দ্বিধা করবেন না।


2
আপনার পরিসংখ্যান বন্ধ। শেষবার কখন আপনি খণ্ডিত সূচীগুলি বা আপডেট হওয়া পরিসংখ্যানগুলি শেষ করবেন? এছাড়াও, আমি টেবিল ভেরিয়েবলের পরিবর্তে একটি টেম্প টেবিল ব্যবহার করার চেষ্টা করব, @ মাইটিবেলওয়ার, কারণ অপ্টিমাইজার সত্যিই টেবিল ভেরিয়েবলের পরিসংখ্যান ব্যবহার করতে পারে না।
অ্যাডাম হেইনেস

আপনার উত্তর আদমের জন্য ধন্যবাদ। @MyTableVar কে একটি টেম্প টেবিলে পরিবর্তন করার কোনও প্রভাব নেই, তবে এটি কেবলমাত্র একটি স্বল্প সংখ্যক সারি (যা কার্যকরকরণ পরিকল্পনা থেকে দেখা যায়)। বাস্তবায়ন পরিকল্পনার মধ্যে কী দেখায় যে আমার পরিসংখ্যান বন্ধ? এটি কি নির্দেশ করে যে কোন সূচিগুলি পুনর্গঠিত বা পুনর্নির্মাণ করা উচিত এবং কোন টেবিল (গুলি) এর পরিসংখ্যান আপডেট করা উচিত?
নিও

3
নীচে ডানদিকে সেই হ্যাশটির বিল্ড ইনপুটটিতে আনুমানিক 24,000 সারি রয়েছে তবে আসল 3,285,620 তাই ভালভাবে ছড়িয়ে পড়তে পারে tempdb। সারি মধ্যে যোগদানের ফলে জন্য অনুমান অর্থাৎ TableAএবং @MyTableVarবন্ধ উপায়। এছাড়াও প্রকারভেদে সারিগুলির সংখ্যা অনুমানের চেয়ে অনেক বেশি যাতে তারা ভালভাবে ছড়িয়ে পড়তে পারে।
মার্টিন স্মিথ

উত্তর:


22

মূল উত্তরটি পাওয়ার আগে আপনার দুটি আপডেট সফটওয়্যার আপডেট করতে হবে।

প্রয়োজনীয় সফ্টওয়্যার আপডেট

প্রথমটি এসকিউএল সার্ভার। আপনি এসকিউএল সার্ভার 2008 সার্ভিস প্যাক 1 চালাচ্ছেন (বিল্ড 2531)। আপনাকে কমপক্ষে বর্তমান সার্ভিস প্যাকের জন্য প্যাচ করা উচিত (এসকিউএল সার্ভার ২০০৮ সার্ভিস প্যাক 3 - বিল্ড 5500)। লেখার সময় এসকিউএল সার্ভার ২০০৮ এর সর্বাধিক সাম্প্রতিক বিল্ডটি হ'ল সার্ভিস প্যাক 3, ক্রমবর্ধমান আপডেট 12 (বিল্ড 5844)।

সফ্টওয়্যারটির দ্বিতীয় অংশটি এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরার । সর্বশেষতম সংস্করণগুলিতে বিশেষজ্ঞ বিশ্লেষণের জন্য সরাসরি একটি ক্যোয়ারী প্ল্যান আপলোড করার ক্ষমতা সহ উল্লেখযোগ্য নতুন বৈশিষ্ট্য এবং সংশোধন রয়েছে (কোথাও এক্সএমএল পেস্ট করার দরকার নেই!)

অনুসন্ধান পরিকল্পনা বিশ্লেষণ

সারণী ভেরিয়েবলের জন্য কার্ডিনালিটির প্রাক্কলনটি হুবহু ঠিক, বিবৃতি-স্তরের পুনঃসংশোধনের জন্য ধন্যবাদ:

টেবিল পরিবর্তনশীল অনুমান

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

প্রথম যোগদানের অনুমান

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

এসকিউএল সার্ভার ২০০৮ এক্সিকিউশন পরিকল্পনায় এটি হাইলাইট করে না; আপনি প্রসারিত ইভেন্ট বা প্রোফাইলার বাছাই সতর্কতা এবং হ্যাশ সতর্কতা ব্যবহার করে স্পিলগুলি নিরীক্ষণ করতে পারেন । এক্সিকিউশন শুরুর আগে মেমরিটি কার্ডিনালিটির অনুমানের ভিত্তিতে বাছাই করা এবং হ্যাশগুলির জন্য সংরক্ষিত থাকে এবং আপনার এসকিউএল সার্ভারের কতটা অতিরিক্ত মেমরি থাকতে পারে তা নির্বিশেষে মৃত্যুদন্ড কার্যকর করার সময় বাড়ানো যায় না। ওয়ার্কস্পেস মেমরি গ্রাসকারী ক্রিয়াকলাপগুলিতে জড়িত যে কোনও এক্সিকিউশন প্ল্যানের জন্য নির্ভুল সারি গণনা অনুমান অতীব গুরুত্বপূর্ণ।

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

সারণী ভেরিয়েবল এবং এর পরিবর্তে অস্থায়ী টেবিলের সাথে আবার কোয়েরিটি চেষ্টা করুন OPTION (RECOMPILE)। আপনার প্রথম যোগদানের ফলাফলটিকে অন্য কোনও অস্থায়ী সারণিতে অন্তর্ভুক্ত করার চেষ্টা করা উচিত, এবং বাকী ক্যোয়ারির বিপরীতে চালানো উচিত। সারিগুলির সংখ্যা এত বড় নয় (3,285,620) তাই এটি যুক্তিসঙ্গত দ্রুত হওয়া উচিত। অপ্টিমাইজারটির পরে যোগদানের ফলাফলের জন্য সঠিক কার্ডিনালিটি অনুমান এবং বিতরণ পরিসংখ্যান থাকবে। ভাগ্যক্রমে, পরিকল্পনাটির বাকী অংশগুলি দুর্দান্তভাবে পড়ে যাবে।

পরিকল্পনায় প্রদর্শিত বৈশিষ্ট্যগুলি থেকে কাজ করা, বস্তুগত জিজ্ঞাসাটি হ'ল:

SELECT
    A.A_Var7_FK_LK,
    A.A_Var4_FK_LK,
    A.A_Var6_FK_LK, 
    A.A_Var5_FK_LK,
    A.A_Var1,
    A.A_Var2,
    A.A_Var3_FK_LK
INTO #AnotherTempTable
FROM @MyTableVar AS B
JOIN TableA AS A
    ON A.Job = B.B_Var1_PK
WHERE
    A_Var8_FK_LK = @Param1;

আপনি INSERTএকটি পূর্বনির্ধারিত অস্থায়ী টেবিলের মধ্যেও যেতে পারেন (পরিকল্পনায় সঠিক ডেটা ধরণের দেখানো হয় না, তাই আমি সেই অংশটি করতে পারি না)। নতুন অস্থায়ী টেবিলটি ক্লাস্টার্ড এবং নন-ক্ল্লাস্টার্ড সূচকগুলি থেকে উপকৃত হতে পারে বা নাও পারে।


এই গভীরতর উত্তরের জন্য অনেক ধন্যবাদ। দুঃখিত, এর জবাব দিতে এক সপ্তাহ সময় নিয়েছে - আমি প্রতিদিন অন্য কাজগুলিতে ছেয়ে গিয়েছি। আমি আপনার পরামর্শগুলি টেবিলএতে যোগদানের বিষয়টি বাস্তবায়িত করেছি #AnotherTempTable। এটির সর্বোত্তম প্রভাব ছিল বলে মনে হয়েছিল - অন্যান্য পরামর্শ (@ মাইটিবেলবারের জন্য টেবিল ভেরিয়েবলের পরিবর্তে একটি টেম্প টেবিল ব্যবহার করা এবং এর কোনওরূপ OPTION (RECOMPILE)প্রভাব বা কোনও ফলপ্রসূ হয়নি) An অন্নমাইজ 'এবং' এসকিউএল পারফরম্যান্স.কম-এ পোস্ট করুন ' এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরারের বিকল্পগুলি দুর্দান্ত - আমি কেবল সেগুলি ব্যবহার করেছি: উত্তর.এসকিএল্পারফর্মেন্স
নিও

-6

আমি লক্ষ্য করেছি যে @MyTableVar এ কোনও পিকে থাকা উচিত এবং সম্মত হন যে #MyTableVar প্রায়শই আরও ভাল পারফরম্যান্স হয় (উদাহরণস্বরূপ, সারি সংখ্যক সারি সহ)।

যেখানে ধারাটির শর্ত

   WHERE A.A_Var8_FK_LK = @Param1

এএন্ড'এডের অভ্যন্তরীণ অংশে যোগদান করা উচিত। অপ্টিমাইজারটি এটি করার জন্য আমার অভিজ্ঞতায় যথেষ্ট চালাক নয় (দুঃখিত পরিকল্পনার দিকে নজর দেয়নি) এবং এটি একটি বিশাল পার্থক্য করতে পারে।

যদি এই পরিবর্তনগুলি উন্নতি না দেখায় আমি এরপরে এ এর ​​আরও একটি টেম্প টেবিল তৈরি করব এবং এ.এ_ভার 8_এফকে_এলকে = @ পরম 1 দ্বারা আবশ্যক সমস্ত বিষয়গুলিকে সীমাবদ্ধ করে (সুন্দরভাবে?) তৈরি করা হবে যদি সেই গোষ্ঠীটি আপনার পক্ষে যৌক্তিক ধারণা দেয়।

তারপরে পরবর্তী যোগদানের শর্তের জন্য সেই টেম্প টেবিলটিতে (তৈরির আগে বা পরে) একটি ক্লাস্টারড সূচক তৈরি করুন।

তারপরে সেই ফলাফলটি কয়েকটি টেবিল (এফ এবং টি) -এ অবশিষ্ট থাকবে।

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

কোনও ট্রেস টেম্পডিবি স্পিলগুলি প্রদর্শন করতে পারে যা এর কঠোর প্রভাব ফেলতে পারে বা নাও পারে।

অন্য একটি বিকল্প পদ্ধতির - এটি কমপক্ষে চেষ্টা করার জন্য দ্রুত - হ'ল সারণির সর্বনিম্ন সংখ্যার (ক) থেকে সারণিগুলি অর্ডার করা এবং তারপরে যোগ দেওয়াগুলিতে মার্জ, হ্যাশ এবং লুপ যুক্ত করা শুরু করুন। ইঙ্গিতগুলি উপস্থিত থাকলে যোগদানের ক্রমটি নির্দিষ্ট হিসাবে ঠিক করা হয়। অন্যান্য ব্যবহারকারীরা বুদ্ধিমানের সাথে এই পদ্ধতিটি এড়িয়ে যান কারণ আপেক্ষিক সারি গণনা নাটকীয়ভাবে পরিবর্তিত হলে এটি দীর্ঘমেয়াদে ক্ষতি করতে পারে। ন্যূনতম সংখ্যার আকাঙ্ক্ষিত।

আপনি যদি এর মধ্যে অনেকগুলি করছেন, সম্ভবত একটি বাণিজ্যিক অপ্টিমাইজার চেষ্টা করার জন্য উপযুক্ত (বা ট্রায়াল) এবং এটি এখনও একটি ভাল শেখার অভিজ্ঞতা।


হ্যাঁ তাই হয়। এটি নিশ্চিত করে যে এ দ্বারা ফিরে আসা সারিগুলি সীমাবদ্ধতার দ্বারা সীমাবদ্ধ। অন্যথায় অপ্টিমাইজার প্রথমে যোগদান করতে পারে এবং পরে সীমাবদ্ধতা প্রয়োগ করতে পারে। আমি প্রতিদিন এটির সাথে ডিল করি।
ক্রোকুসেক 3'13

4
আপনি @ Crokusek- কে ব্লক করেছেন এসকিউএল-সার্ভারের অপ্টিমাইজারটি কোয়েরিগুলির সমতুল্য (যখন কোনও শর্ত WHNE বা অন ক্লজে থাকুক না কেন) জেনে রাখার ক্ষেত্রে এটি বেশ ভাল it's
ypercubeᵀᴹ

6
আপনি ক্যোরি অপ্টিমাইজারে পল হোয়াইটের সিরিজটি দরকারী বলে মনে করতে পারেন।
মার্টিন স্মিথ

এটি একটি ভয়ানক অভ্যাস। সম্ভবত এটি এই বিশেষ ক্ষেত্রে হবে (যেখানে একটি সীমাবদ্ধতা রয়েছে) তবে আমি একাধিক বিকাশকারীদের দেশ থেকে এখানে এসেছি যেখানে শর্তে শর্তাবলীতে পাইলিং রয়েছে। এসকিউএল সার্ভার আপনার জন্য যোগদানের জন্য ধারাবাহিকভাবে তাদের "সরানো" করে না
ক্রোকসেক

বাহ্যিক (এবং ডান যোগদান করে) এর জন্য ভুল সম্মত হন। অতঃপর যখন হয় শুধুমাত্র মধ্যে এক্সপ্রেশন AND'd যেখানে দফা এবং প্রতিটি শব্দ অনুরূপ একটি কেবলমাত্র একটি নির্দিষ্ট ভেতরের যোগদানের জন্য, যে শব্দটি নিরাপদে এবং অসংশয়ে একটি অপ্টিমাইজেশান এবং সেরা অনুশীলনের (আইএমও) হিসাবে "এ" স্থানে সরিয়ে ফেলা হতে পারে। এটি "সত্য" যোগদানের শর্ত হোক বা কেবল একটি নির্দিষ্ট প্রতিবন্ধকতা বড় পারফরম্যান্স লাভের জন্য গৌণ। সেই লিঙ্কটি একটি তুচ্ছ মামলার জন্য। বাস্তব জীবনে একাধিক রয়েছে যেখানে রূপান্তর () এবং গণিতের সাথে শর্ত থাকে এবং এগুলি সর্বোত্তম অনুশীলনগুলি গ্রহণ করার জন্য তাদের আরও ভাল প্রার্থী করে তোলে।
ক্রোকুসেক 3'13
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.