সম্পাদন পরিকল্পনা ব্যয়বহুল CONVERT_IMPLICIT অপারেশন দেখায় shows আমি কি এটিকে সূচি দিয়ে ঠিক করতে পারি বা আমার কি টেবিলটি পরিবর্তন করা দরকার?


24

আমার কাছে সত্যই গুরুত্বপূর্ণ, ধীরে ধীরে দৃষ্টিভঙ্গি রয়েছে যার মধ্যে এর মতো কিছু সত্যই কদর্য শর্ত রয়েছে cla আমি আরও সচেতন যে varchar(13)পূর্ণসংখ্যার পরিচয় ক্ষেত্রগুলির পরিবর্তে সংযোগগুলি স্থূল এবং ধীরে যোগ দেয় , তবে নীচের সরল ক্যোয়ারী যা এই দর্শনটি ব্যবহার করে তা উন্নত করতে চাই:

CREATE VIEW [dbo].[vwReallySlowView]  AS  
AS  
SELECT     
  I.booking_no_v32 AS bkno, 
  I.trans_type_v41 AS trantype, 
  B.Assigned_to_v61 AS Assignbk, 
  B.order_date AS dateo, B.HourBooked AS HBooked,   
  B.MinBooked AS MBooked, B.SecBooked AS SBooked, 
  I.prep_on AS Pon, I.From_locn AS Flocn, 
  I.Trans_to_locn AS TTlocn,   
                      (CASE I.prep_on WHEN 'Y' THEN I.PDate ELSE I.FirstDate END) AS PrDate, I.PTimeH AS PrTimeH, I.PTimeM AS PrTimeM,   
                      (CASE WHEN I.RetnDate < I.FirstDate THEN I.FirstDate ELSE I.RetnDate END) AS RDatev, I.bit_field_v41 AS bitField, I.FirstDate AS FDatev, I.BookDate AS DBooked,   
                      I.TimeBookedH AS TBookH, I.TimeBookedM AS TBookM, I.TimeBookedS AS TBookS, I.del_time_hour AS dth, I.del_time_min AS dtm, I.return_to_locn AS rtlocn,   
                      I.return_time_hour AS rth, I.return_time_min AS rtm, (CASE WHEN I.Trans_type_v41 IN (6, 7) AND (I.Trans_qty < I.QtyCheckedOut)   
                      THEN 0 WHEN I.Trans_type_v41 IN (6, 7) AND (I.Trans_qty >= I.QtyCheckedOut) THEN I.Trans_Qty - I.QtyCheckedOut ELSE I.trans_qty END) AS trqty,   
                      (CASE WHEN I.Trans_type_v41 IN (6, 7) THEN 0 ELSE I.QtyCheckedOut END) AS MyQtycheckedout, (CASE WHEN I.Trans_type_v41 IN (6, 7)   
                      THEN 0 ELSE I.QtyReturned END) AS retqty, I.ID, B.BookingProgressStatus AS bkProg, I.product_code_v42, I.return_to_locn, I.AssignTo, I.AssignType,   
                      I.QtyReserved, B.DeprepOn,  
        (CASE  B.DeprepOn       
        WHEN 1 THEN  B.DeprepDateTime     
        ELSE   I.RetnDate  
           END)  AS DeprepDateTime, I.InRack 
FROM         dbo.tblItemtran AS I 

INNER JOIN  -- booking_no = varchar(13)
         dbo.tblbookings AS B ON B.booking_no = I.booking_no_v32  --  string inner-join

INNER JOIN  -- product_code = varchar(13) 
        dbo.tblInvmas AS M ON I.product_code_v42 = M.product_code  --  string inner-join

WHERE     (I.trans_type_v41 NOT IN (2, 3, 7, 18, 19, 20, 21, 12, 13, 22)) AND (I.trans_type_v41 NOT IN (6, 7)) AND (I.bit_field_v41 & 4 = 0) OR  
                      (I.trans_type_v41 NOT IN (6, 7)) AND (I.bit_field_v41 & 4 = 0) AND (B.BookingProgressStatus = 1) OR  
                      (I.trans_type_v41 IN (6, 7)) AND (I.bit_field_v41 & 4 = 0) AND (I.QtyCheckedOut = 0) OR  
                      (I.trans_type_v41 IN (6, 7)) AND (I.bit_field_v41 & 4 = 0) AND (I.QtyCheckedOut > 0) AND (I.trans_qty - (I.QtyCheckedOut - I.QtyReturned) > 0)  

এই দৃশ্যটি সাধারণত এইভাবে ব্যবহৃত হয়:

select * from vwReallySlowView
where product_code_v42  = 'LIGHTBULB100W'  -- find "100 watt lightbulb" rows

আমি যখন এটি চালনা করি তখন ব্যাচের মোট ব্যয়ের 20 থেকে 80% দামের এই এক্সিকিউশন প্ল্যান আইটেমটি পাই, ভবিষ্যদ্বাণী CONVERT_IMPLICIT( .... &(4))দেখিয়ে যে এগুলি করা খুব ধীর বলে মনে bitwise boolean testsহচ্ছে (I.ibitfield & 4 = 0)

আমি এমএস এসকিউএল বা ডিবিএ টাইপ ওয়ার্কে সাধারণ নই কারণ আমি বেশিরভাগ সময় নন-এসকিউএল সফ্টওয়্যার বিকাশ করি। তবে আমি সন্দেহ করি যে এই ধরণের বিটওয়াইজ সংমিশ্রণগুলি একটি খারাপ ধারণা, এবং পৃথক বুলেটিয়ান ক্ষেত্রগুলি থাকলে ভাল হত।

স্কিমার পরিবর্তন না করেই এই ভিউটিটি ভালভাবে পরিচালনা করার জন্য আমি কীভাবে এই সূচকটি উন্নত করতে পারি (ইতিমধ্যে কয়েক হাজার লোকেশনে উত্পাদন চলছে) বা bit_field_v41এই সমস্যাটি সমাধানের জন্য আমার অবশ্যই অন্তর্নিহিত টেবিলটি পরিবর্তন করতে হবে যার বেশ কয়েকটি বুলিয়ান মান রয়েছে যা একটি পূর্ণসংখ্যায় পূর্ণ হয়? ?

tblItemtranএই বাস্তবায়ন পরিকল্পনায় স্ক্যান করা হচ্ছে আমার ক্লাস্টার্ড সূচক এখানে :

-- goal:  speed up  select * from vwReallySlowView where productcode  = 'X'
CREATE CLUSTERED INDEX [idxtblItemTranProductCodeAndTransType] ON [dbo].[tblItemtran] 
(
    [product_code_v42] ASC,  -- varchar(13)
    [trans_type_v41] ASC     -- int
)WITH ( PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, 
        IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, 
        ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]

এই CONVERT_IMPLICITপূর্বাভাসের উপর 27% দামের ফলস্বরূপ অন্যান্য পণ্যগুলির মধ্যে একটির জন্য এখানে কার্যকরকরণ পরিকল্পনা রয়েছে is আপডেট নোট করুন যে এই ক্ষেত্রে, আমার সবচেয়ে খারাপ-নোড এখন একটি "হ্যাশ ম্যাচ" inner join, যার দাম 34% আমি বিশ্বাস করি এটি এমন একটি খরচ যা আমি এড়াতে পারি না যদি না আমি স্ট্রিংগুলিতে যোগ দিতে এড়াতে পারি না যা আমি বর্তমানে পারছি না পরিত্রাণ পেতে. INNER JOINউপরের দৃশ্যে উভয় অপারেশন varchar(13)মাঠে রয়েছে।

নীচে ডান কোণে জুম ইন:

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

.Sqlplan হিসাবে সম্পূর্ণ সম্পাদন পরিকল্পনা স্কাইড্রাইভে উপলব্ধ। এই চিত্রটি কেবল একটি চাক্ষুষ ওভারভিউ। নিজেই ছবিটি দেখতে এখানে ক্লিক করুন

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

আপডেট সম্পূর্ণ বাস্তবায়ন পরিকল্পনা পোস্ট। আমি product_codeমানসিকভাবে রোগগত দিক থেকে খারাপ কী তা খুঁজে পেতে পারি না , তবে এটি করার একটি উপায় হ'ল select count(*) from viewএকক পণ্য না করে instead তবে যে পণ্যগুলি অন্তর্নিহিত টেবিলের রেকর্ডের কেবল 5% ব্যবহার করা হয় সেগুলি CONVERT_IMPLICIT অপারেশনে অনেক কম ব্যয় দেখায় । যদি আমি এখানে এসকিউএল ঠিক করতে যাচ্ছি, আমি মনে করি আমি WHEREভিউতে স্থূল ধারা গ্রহণ করবো , এবং অন্তর্নিহিত সারণীতে "ইনক্লুডমেইনভিউ" বিট-ফিল্ড হিসাবে ক্লজ-শর্ত হিসাবে সেই দৈত্যের ফলাফল গণনা এবং সংরক্ষণ করব । প্রেস্টো, সমস্যার সমাধান হয়েছে, তাই না?



আমি পোস্ট করা। এসকিউএলপিএল মূল চিত্রের 432 কে / 17 কেসের চেয়ে অনেক কম প্যাথলজিকাল। আমি ক্ষমাপ্রার্থী আমি আমার ডেটা দিয়ে product_codeসেই প্যাথলজিকাল 87%কেস উত্পন্ন করতে যে মূল্য ব্যবহার করেছি তা আর খুঁজে পাচ্ছি না । ছবিগুলি এখন দেখায় 27%। আবার, আমার সম্পাদনার কারণে বিভ্রান্তির জন্য ক্ষমা চাই।
ওয়ারেন পি

উত্তর:


49

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

আইটেমট্রান ক্লাস্টার্ড সূচক অপারেটর সন্ধান করুন

আইটেম ট্র্যান ক্লাস্টার্ড সূচি সন্ধান করুন

এই অপারেটরটি সত্যিই একটিতে দুটি অপারেশন। প্রথমে একটি সূচক সন্ধানের ক্রিয়াকলাপটি সমস্ত সারি সন্ধান করে যা প্রেডিকেটের সাথে মেলে product_code_v42 = 'M10BOLT', তারপরে প্রতিটি সারিতে অবশিষ্ট অবশেষ bit_field_v41 & 4 = 0প্রয়োগ করা হয় applied bit_field_v41এর বেস টাইপ ( tinyintবা smallint) থেকে এর মধ্যে অন্তর্নিহিত রূপান্তর রয়েছে integer

রূপান্তর ঘটে কারণ বিটওয়াইড-ওআরডি অপারেটর (&) উভয় অপারেন্ডকে একই ধরণের হওয়া দরকার। ধ্রুবক মান '4' এর অন্তর্নির্মিত ধরণটি পূর্ণসংখ্যা এবং ডেটা টাইপের অগ্রাধিকার নিয়মের অর্থ নিম্ন-অগ্রাধিকার bit_field_v41ক্ষেত্রের মান রূপান্তরিত।

সমস্যাটি (যেমন এটি হ'ল) ​​প্রিকেটটি লিখে সহজেই সংশোধন করা হয় bit_field_v41 & CONVERT(tinyint, 4) = 0- যার অর্থ ধ্রুবক মানটি কম অগ্রাধিকার পায় এবং কলাম মানের পরিবর্তে (ধ্রুবক ভাঁজ করার সময়) রূপান্তরিত হয়। যদি কোনও রূপান্তর bit_field_v41হয় tinyintনা তবে তা ঘটে। একইভাবে, CONVERT(smallint, 4)যদি ব্যবহার করা যেতে পারে bit_field_v41হয় smallint। এটি বলেছিল, রূপান্তরটি এই ক্ষেত্রে কোনও পারফরম্যান্সের সমস্যা নয় , তবে প্রকারের সাথে মেলে ধরতে এবং যেখানে সম্ভব সেখানে অন্তর্নিহিত রূপান্তরগুলি এড়ানো ভাল অনুশীলন।

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

অনুসন্ধান, অবশিষ্টাংশ এবং আউটপুট কলাম অনুসন্ধান, এই অপারেটরের কর্মক্ষমতা সমতুল্য ক্যোয়ারী তৈরি করে বিচ্ছিন্নভাবে পরীক্ষা করা যেতে পারে ( 1 <> 2স্বয়ংক্রিয়-পরামিতি রোধ করার কৌশল), অপটিমাইজার দ্বারা বৈপরীত্য অপসারণ করা হয় এবং এতে উপস্থিত হয় না ক্যোয়ারী পরিকল্পনা):

SELECT
    it.booking_no_v32,
    it.QtyCheckedOut,
    it.QtyReturned,
    it.Trans_qty,
    it.trans_type_v41
FROM dbo.tblItemTran AS it
WHERE
    1 <> 2
    AND it.product_code_v42 = 'M10BOLT'
    AND it.bit_field_v41 & CONVERT(tinyint, 4) = 0;

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

আমি এসকিউএল ডেটা জেনারেটর ব্যবহার করে উত্পন্ন নমুনা ডেটা ব্যবহার করে রিড-ফরোয়ারে ফ্র্যাগমেন্টেশন এর প্রভাবের একটি পরীক্ষা করেছি । প্রশ্নের কোয়েরি পরিকল্পনায় প্রদর্শিত একই টেবিলের সারি গণনাগুলি ব্যবহার করে, একটি অত্যন্ত খণ্ডিত ক্লাস্টারড সূচক SELECT * FROM view15 সেকেন্ড পরে নেওয়ার ফলস্বরূপ DBCC DROPCLEANBUFFERS। আইটেমট্রান্স টেবিলটিতে নতুনভাবে পুনর্নির্মাণ ক্লাস্টার ইনডেক্সের সাথে একই পরিস্থিতিতে একই পরীক্ষা 3 সেকেন্ডের মধ্যে শেষ হয়েছে।

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

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

ফিল্টার অপারেটর

ফিল্টার অপারেটর

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

SELECT
    it.booking_no_v32,
    it.trans_type_v41,
    it.Trans_qty,
    it.QtyReturned,
    it.QtyCheckedOut
FROM dbo.tblItemTran AS it
WHERE
    it.product_code_v42 = 'M10BOLT'
    AND it.bit_field_v41 & CONVERT(tinyint, 4) = 0
    AND
    (
        (
            it.trans_type_v41 NOT IN (2, 3, 6, 7, 18, 19, 20, 21, 12, 13, 22)
            AND it.trans_type_v41 NOT IN (6, 7)
        )
        OR
        (
            it.trans_type_v41 NOT IN (6, 7)
        )
        OR 
        (
            it.trans_type_v41 IN (6, 7)
            AND it.QtyCheckedOut = 0
        )
        OR 
        (
            it.trans_type_v41 IN (6, 7)
            AND it.QtyCheckedOut > 0
            AND it.trans_qty - (it.QtyCheckedOut - it.QtyReturned) > 0
        )
    );

পরিকল্পনার কম্পিউট স্কেলার অপারেটর নিম্নলিখিত এক্সপ্রেশনটিকে সংজ্ঞায়িত করে (পরবর্তী অপারেটরের দ্বারা ফলাফলের প্রয়োজনীয়তা না হওয়া পর্যন্ত গণনা নিজেই পিছিয়ে যায়):

[Expr1016] = (trans_qty - (QtyCheckedOut - QtyReturned))

হ্যাশ ম্যাচ অপারেটর

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

হ্যাশ ম্যাচ অপারেটর booking_no_v32আইটেমট্রান টেবিল থেকে কলামের (হ্যাশ কী তৈরি করুন) মানগুলি ব্যবহার করে একটি হ্যাশ টেবিল তৈরি করে এবং তারপরে booking_noবুকিং সারণী থেকে কলাম (হ্যাশ কীগুলি প্রোব) ব্যবহার করে ম্যাচের জন্য অনুসন্ধান করবে। এসএসএমএস টুলটিপটি সাধারণত একটি প্রোব অবশিষ্টাংশ প্রদর্শন করে তবে পাঠ্যটি একটি টুলটিপটির জন্য অনেক দীর্ঘ এবং সহজভাবে বাদ দেওয়া যায়।

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

হ্যাশ ম্যাচ অপারেটর

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

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

দুঃখের বিষয়, এসকিউএল সার্ভার ২০১২-এর আগে, এক্সিকিউশন প্ল্যানে কোনও ইঙ্গিত পাওয়া যায়নি যে একটি হ্যাশিং অপারেশন তার মেমরির বরাদ্দকে ছাড়িয়ে গেছে (যা সার্ভারে ফ্রি মেমরির সংখ্যা থাকলেও, কার্যকর করা শুরু হওয়ার আগে সংরক্ষিত হওয়ার পরে গতিশীলভাবে বৃদ্ধি পেতে পারে না) এবং এতে ছড়িয়ে পড়েছিল tempdb। প্রোফাইলার ব্যবহার করে হ্যাশ সতর্কতা ইভেন্ট ক্লাসটি পর্যবেক্ষণ করা সম্ভব তবে নির্দিষ্ট প্রশ্নের সাথে সতর্কতাগুলির সাথে সম্পর্ক স্থাপন করা কঠিন হতে পারে।

সমস্যা সংশোধন করা হচ্ছে

তিনটি বিষয় হ'ল বিভাজন, হ্যাশ ম্যাচ অপারেটরের জটিল তদন্ত অবশিষ্ট এবং সূচি সন্ধানের অনুমানের ফলে ভুল কার্ডিনালিটির অনুমান।

প্রস্তাবিত সমাধান

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

ALTER TABLE dbo.tblItemTran
ADD Bit3 AS bit_field_v41 & CONVERT(tinyint, 4);

CREATE STATISTICS [stats dbo.ItemTran (product_code_v42, Bit3)]
ON dbo.tblItemTran (product_code_v42, Bit3);

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

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

ক্যোয়ারি পারফরম্যান্স সমস্যার সমাধান করার সময়, অতিবাহিত সময়, সিপিইউর ব্যবহার, লজিক্যাল রিডস, শারীরিক পাঠ, অপেক্ষা করার ধরণ এবং সময়সীমা ... ইত্যাদি বিষয়গুলি পরিমাপ করা গুরুত্বপূর্ণ important উপরে বর্ণিত সন্দেহজনক কারণগুলি বৈধ করতে পৃথকভাবে ক্যোয়ারির অংশগুলি চালানোও কার্যকর হতে পারে।

কিছু পরিবেশে, যেখানে উপাত্তের আপ-টু-সেকেন্ড ভিউ গুরুত্বপূর্ণ নয়, এমন ব্যাকগ্রাউন্ড প্রক্রিয়া চালানো কার্যকর হতে পারে যা প্রায়শই প্রায়শই একটি স্ন্যাপশট টেবিলের মধ্যে পুরো ভিউটিকে রূপায়িত করে। এই টেবিলটি কেবলমাত্র একটি সাধারণ বেস টেবিল এবং আপডেটের পারফরম্যান্সকে প্রভাবিত করার বিষয়ে চিন্তা না করে পঠিত প্রশ্নের জন্য সূচিযুক্ত করা যেতে পারে।

সূচী দেখুন

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

আংশিক সূচকযুক্ত দৃশ্যের সাথে উন্নত সমাধান

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

-- Indexed view to optimize the main view
CREATE VIEW dbo.V1
WITH SCHEMABINDING
AS
SELECT
    it.ID,
    it.product_code_v42,
    it.trans_type_v41,
    it.booking_no_v32,
    it.Trans_qty,
    it.QtyReturned,
    it.QtyCheckedOut,
    it.QtyReserved,
    it.bit_field_v41,
    it.prep_on,
    it.From_locn,
    it.Trans_to_locn,
    it.PDate,
    it.FirstDate,
    it.PTimeH,
    it.PTimeM,
    it.RetnDate,
    it.BookDate,
    it.TimeBookedH,
    it.TimeBookedM,
    it.TimeBookedS,
    it.del_time_hour,
    it.del_time_min,
    it.return_to_locn,
    it.return_time_hour,
    it.return_time_min,
    it.AssignTo,
    it.AssignType,
    it.InRack
FROM dbo.tblItemTran AS it
JOIN dbo.tblBookings AS tb ON
    tb.booking_no = it.booking_no_v32
WHERE
    (
        it.trans_type_v41 NOT IN (2, 3, 7, 18, 19, 20, 21, 12, 13, 22)
        AND it.trans_type_v41 NOT IN (6, 7)
        AND it.bit_field_v41 & CONVERT(tinyint, 4) = 0
    )
    OR
    (
        it.trans_type_v41 NOT IN (6, 7)
        AND it.bit_field_v41 & CONVERT(tinyint, 4) = 0
        AND tb.BookingProgressStatus = 1
    )
    OR 
    (
        it.trans_type_v41 IN (6, 7)
        AND it.bit_field_v41 & CONVERT(tinyint, 4) = 0
        AND it.QtyCheckedOut = 0
    )
    OR 
    (
        it.trans_type_v41 IN (6, 7)
        AND it.bit_field_v41 & CONVERT(tinyint, 4) = 0
        AND it.QtyCheckedOut > 0
        AND it.trans_qty - (it.QtyCheckedOut - it.QtyReturned) > 0
    );
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.V1 (product_code_v42, ID);
GO

উপরের ইনডেক্সড ভিউটি ব্যবহার করতে বিদ্যমান দৃশ্যটি টুইট করা হয়েছে:

CREATE VIEW [dbo].[vwReallySlowView2]
AS
SELECT
    I.booking_no_v32 AS bkno,
    I.trans_type_v41 AS trantype,
    B.Assigned_to_v61 AS Assignbk,
    B.order_date AS dateo,
    B.HourBooked AS HBooked,
    B.MinBooked AS MBooked,
    B.SecBooked AS SBooked,
    I.prep_on AS Pon,
    I.From_locn AS Flocn,
    I.Trans_to_locn AS TTlocn,
    CASE I.prep_on 
        WHEN 'Y' THEN I.PDate
        ELSE I.FirstDate
    END AS PrDate,
    I.PTimeH AS PrTimeH,
    I.PTimeM AS PrTimeM,
    CASE
        WHEN I.RetnDate < I.FirstDate 
        THEN I.FirstDate 
        ELSE I.RetnDate
    END AS RDatev,
    I.bit_field_v41 AS bitField,
    I.FirstDate AS FDatev,
    I.BookDate AS DBooked,
    I.TimeBookedH AS TBookH,
    I.TimeBookedM AS TBookM,
    I.TimeBookedS AS TBookS,
    I.del_time_hour AS dth,
    I.del_time_min AS dtm,
    I.return_to_locn AS rtlocn,
    I.return_time_hour AS rth,
    I.return_time_min AS rtm,
    CASE
        WHEN
            I.Trans_type_v41 IN (6, 7) 
            AND I.Trans_qty < I.QtyCheckedOut
            THEN 0 
        WHEN
            I.Trans_type_v41 IN (6, 7)
            AND I.Trans_qty >= I.QtyCheckedOut
            THEN I.Trans_Qty - I.QtyCheckedOut
        ELSE
            I.trans_qty
    END AS trqty,
    CASE
        WHEN I.Trans_type_v41 IN (6, 7)
        THEN 0
        ELSE I.QtyCheckedOut
    END AS MyQtycheckedout,
    CASE
        WHEN I.Trans_type_v41 IN (6, 7)
        THEN 0
        ELSE I.QtyReturned
    END AS retqty,
    I.ID,
    B.BookingProgressStatus AS bkProg,
    I.product_code_v42,
    I.return_to_locn,
    I.AssignTo,
    I.AssignType,
    I.QtyReserved,
    B.DeprepOn,
    CASE B.DeprepOn
        WHEN 1 THEN B.DeprepDateTime
        ELSE I.RetnDate
    END AS DeprepDateTime,
    I.InRack
FROM dbo.V1 AS I WITH (NOEXPAND)
JOIN dbo.tblbookings AS B ON
    B.booking_no = I.booking_no_v32
JOIN dbo.tblInvmas AS M ON
    I.product_code_v42 = M.product_code;

ক্যোয়ারী এবং সম্পাদন পরিকল্পনা উদাহরণ:

SELECT
    vrsv.*
FROM dbo.vwReallySlowView2 AS vrsv
WHERE vrsv.product_code_v42 = 'M10BOLT';

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

নতুন পরিকল্পনায় হ্যাশ ম্যাচের কোনও অবশিষ্টাংশের শিকারী বাধা নেই , কোনও জটিল ফিল্টার নেই , সূচী দৃষ্টিভঙ্গির সন্ধানে কোনও অবশিষ্ট অবদান নেই এবং কার্ডিনালিটির অনুমানগুলি ঠিক সঠিক।

কীভাবে সন্নিবেশ / আপডেট / মোছার পরিকল্পনাগুলি প্রভাবিত হবে তার উদাহরণ হিসাবে, এটি আইটেম ট্রান্স টেবিলটিতে সন্নিবেশ করার পরিকল্পনা:

পরিকল্পনা Inোকান

হাইলাইট করা বিভাগটি নতুন এবং সূচিযুক্ত ভিউ রক্ষণাবেক্ষণের জন্য প্রয়োজনীয়। টেবিল স্পুল সূচিবদ্ধ ভিউ রক্ষণাবেক্ষণের জন্য sertedোকানো বেস টেবিল সারিগুলি পুনরায় প্রদর্শন করে। প্রতিটি সারি ক্লাস্টারড ইনডেক্সের সাহায্যে বুকিং টেবিলের সাথে যুক্ত হয়, তারপরে একটি ফিল্টার জটিল WHEREক্লজটির পূর্বাভাসগুলি প্রয়োগ করে যে সারিটি ভিউতে যুক্ত করা দরকার কিনা তা দেখার জন্য। যদি তা হয় তবে ভিউয়ের ক্লাস্টারড ইনডেক্সে একটি সন্নিবেশ সম্পাদন করা হয়।

SELECT * FROM viewপূর্বে সঞ্চালিত একই পরীক্ষাটি স্থানের সূচকযুক্ত দর্শন সহ 150 মিমিতে সম্পূর্ণ হয়েছিল।

চূড়ান্ত জিনিস: আমি লক্ষ্য করেছি যে আপনার ২০০৮ আর 2 সার্ভারটি এখনও আরটিএম এ রয়েছে। এটি আপনার পারফরম্যান্সের সমস্যাগুলি সমাধান করবে না, তবে ২০০২ আর ২০১২ এর জন্য সার্ভিস প্যাক ২ জুলাই ২০১২ সাল থেকে পাওয়া গেছে এবং সার্ভিস প্যাকগুলি দিয়ে যথাসম্ভব বর্তমান রাখার অনেকগুলি ভাল কারণ রয়েছে।

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