টি-এসকিউএল ক্যোয়ারী আমি আপডেট করছি এমন সারিগুলির উপর নির্ভর করে সম্পূর্ণ ভিন্ন পরিকল্পনা ব্যবহার করে


20

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

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

আমি ভেবেছিলাম যে সমান্তরালতাটি দোষারোপ হতে পারে, তাই আমি MAXDOP 1কোয়েরিটি সেট করেছিলাম , তবে কোনও ফলস্বরূপ হয়নি - সেই পদক্ষেপটি চলে গেছে, তবে খারাপ পছন্দ / পারফরম্যান্স হয়নি। sp_updatestatsকারণটি ছিল না তা নিশ্চিত করতে আমি আজ সকালেই ছুটে এসেছি ।

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

    update top (10000) FactSubscriberUsage3
               set AccountID = sma.CustomerID
    --select top 50 f.AccountID, sma.CustomerID
      from FactSubscriberUsage3 f
      join dimTime t
        on f.TimeID = t.TimeID
      join #mac sma
        on f.macid = sma.macid
       and t.TimeValue between sma.StartDate and sma.enddate 
     where f.AccountID = 0 --There's a filtered index on the table for this

দ্রুত পরিকল্পনাটি এখানে : দ্রুত সম্পাদন পরিকল্পনা

এবং এখানে ধীর একটি : স্লো এক্সিকিউশন প্ল্যান

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

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

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

এখানে 10, 100 এবং 1000 টি সারির সংক্ষিপ্তসার রয়েছে - আপনি দেখতে পাচ্ছেন যে 1000 সারি ক্যোয়ারীটি অন্যের সাথে একরকমভাবে বের হওয়ার উপায় নয়: বিবৃতি সংক্ষিপ্তসার

আপনি দেখতে পাচ্ছেন যে তৃতীয় ক্যোয়ারিতে একটি হাস্যকর সংখ্যা রয়েছে যার ফলে এটি স্পষ্টতই কিছু আলাদা করছে। এখানে সারি গণনা সহ আনুমানিক বাস্তবায়ন পরিকল্পনা। 1000-সারির আনুমানিক বাস্তবায়ন পরিকল্পনা: 1000-সারি আনুমানিক বাস্তবায়ন পরিকল্পনা

এবং এখানে কার্যনির্বাহী পরিকল্পনার আসল ফলাফলগুলি (যাইহোক, "কখনই শেষ হয় না" এর মাধ্যমে দেখা যায়, আমি বোঝাতে চাইছি "এক ঘন্টার মধ্যে শেষ")। 1000-সারি প্রকৃত বাস্তবায়ন পরিকল্পনা 1000-সারি প্রকৃত বাস্তবায়ন পরিকল্পনা

প্রথম যে বিষয়টি আমি লক্ষ্য করেছি সেটি হ'ল, ডিমেটাইম টেবিল থেকে 60K সারি টানার পরিবর্তে এটি প্রত্যাশিত, এটি আসলে একটি বি দিয়ে 1.6 বিলিয়ন টানছে । আমার ক্যোয়ারির দিকে তাকিয়ে, আমি নিশ্চিত না যে এটি ডিমেটাইম টেবিল থেকে কীভাবে অনেকগুলি সারি পিছনে টানছে। আমি যে বিটিউইন অপারেটরটি ব্যবহার করছি তা নিশ্চিত করে যে আমি ফ্যাক্ট টেবিলের সময় রেকর্ডের উপর ভিত্তি করে # ম্যাক থেকে সঠিক রেকর্ডটি টানছি। যাইহোক, আমি যখন ক্লিয়ার ক্লজটিতে একটি লাইন যুক্ত করি যেখানে আমি t.TimeValue (বা t.TimeID) কে একটি মানতে ফিল্টার করি, তখন কয়েক সেকেন্ডের মধ্যে আমি সফলভাবে 100,000 সারি আপডেট করতে পারি। এর ফলস্বরূপ, এবং আমি অন্তর্ভুক্ত কার্যকরকরণ পরিকল্পনাগুলিতে স্পষ্ট করে দিয়েছি যে এটি আমার সময়সীমাটিই সমস্যা is এটা স্পষ্ট but তবে আমি নিশ্চিত নই যে আমি কীভাবে এই সমস্যাটিকে ঘিরে কাজ করতে এবং যথার্থতা বজায় রাখতে যোগদানের মানদণ্ডকে পরিবর্তন করব । কোন চিন্তা?

রেফারেন্সের জন্য, এখানে 100 সারি আপডেটের জন্য পরিকল্পনা (সারি গণনা সহ)। আপনি দেখতে পাচ্ছেন যে এটি একই সূচকটিকে হিট করে এবং এখনও এক টন সারি দিয়ে, তবে সমস্যার একই মাত্রার কাছাকাছি কোথাও নেই। সারি গণনা সহ 100 টি সারি কার্যকরকরণ : এখানে চিত্র বর্ণনা লিখুন


এটি পরিসংখ্যান হতে হবে। আপনি sp_updatestatisticsটেবিলে একটি চালানো আছে ?
জেএনকে

@ জেএনকে: আমি প্রাথমিকভাবে এটি ভেবেছিলাম তবে ইতিমধ্যে কোনও পরিবর্তন ছাড়াই এসপি_আপডেস্ট্যাটস চালিয়েছি। আমি কেবল এটি আবার চালিয়েছি এবং ক্যোয়ারির সাথে জড়িত কোনও সূচকের পরিসংখ্যান আপডেট করার কোনও যত্ন নেই। ধন্যবাদ যদিও!
স্কেলরিয়ান

দ্বিতীয়টি হ'ল সংক্ষিপ্ত (প্রতি সারি) পরিবর্তে একটি প্রশস্ত (প্রতি সূচক) আপডেট পরিকল্পনা যা অতিরিক্ত দৃশ্যমান জটিলতার কিছু ব্যাখ্যা করে। তবে সত্যিই কেবল পার্থক্য হ'ল অর্ডার from #mac sma join f on f.macid = sma.macid join dimTime t on f.TimeID = t.TimeID and t.TimeValue between sma.StartDate and sma.enddateবনামfrom #mac join t on t.TimeValue between sma.StartDate and sma.enddate join f on f.TimeID = t.TimeID and f.macid = sma.macid
মার্টিন স্মিথ

কোনকিছু এখানে ঠিক নেই। এমনকি ব্যয়বহুল ক্যোয়ারী পরিকল্পনাটি ক্রমবর্ধমানভাবে সারি তৈরি করা উচিত। একটি TOP 50এখনও দ্রুত কার্যকর করা উচিত। আপনি এক্সএমএল পরিকল্পনা আপলোড করতে পারেন? আমার সারি সংখ্যার দিকে নজর দেওয়া দরকার। আপনি TOP 50ম্যাক্সডপ 1 দিয়ে এবং একটি নির্বাচন হিসাবে চালাতে পারেন , আপডেট হিসাবে নয় এবং পরিকল্পনাটি পোস্ট করতে পারেন? (অনুসন্ধানের স্থানটিকে সরল করার / দ্বিখণ্ডিত করার চেষ্টা করা)।
usr

@ আরআর যোগদানের ফলে t.TimeValue between sma.StartDate and sma.enddateঅনেক বেশি অব্যর্থ সারি তৈরি হতে পারে যা পরবর্তীতে ফ্যাক্টসউসক্রাইবারের বিরুদ্ধে যোগদানের ফলে ফিল্টার হয়ে যায় এবং চূড়ান্ত ফলাফলটিতে শেষ না হয়।
মার্টিন স্মিথ

উত্তর:


3

ডিমটাইমে সূচক পরিবর্তন হচ্ছে। দ্রুত পরিকল্পনাটি _ ডিটিএ সূচক ব্যবহার করছে। প্রথমে নিশ্চিত হয়ে নিন যে সিস.ইনডেক্সে অনুমান সূচক হিসাবে চিহ্নিত না হয়েছে।

আপনি ভেবেছিলেন যে আপনি @ স্টার্টডেট এবং @ এন্ডডেটের মধ্যে এই WHERE t.TimeValue এর মতো শুরু / শেষ তারিখের পরিবর্তে ফিল্টার করতে # ম্যাক টেবিলটি ব্যবহার করে কিছু প্যারামিটারাইজেশনকে বাইপাস করতে পারেন। টেম্প টেবিলটি থেকে মুক্তি পান।


ডিটিএ প্রিফিক্সড ইনডেক্সটি দেখে মনে হচ্ছে এটি নাম কাস্টমাইজ না করে ডিটিএর প্রস্তাবনা অনুসরণ করে তৈরি করা হয়েছিল। হাইপোথিটিক্যাল ইনডেক্সগুলি প্রকৃত বাস্তবায়ন পরিকল্পনায় হাজির হতে পারে না (এবং আনুমানিক কিছু অকাট্য কমান্ড ছাড়াও হয় না)। আপনার দ্বিতীয় পরামর্শ কীভাবে কাজ করবে তা নিশ্চিত নয়। t.TimeValue between sma.StartDate and sma.enddateপারস্পরিক সম্পর্কযুক্ত তাই #tempটেবিলের প্রতিটি সারির জন্য পরিবর্তন করতে পারেন । ওপি কী দিয়ে এটি প্রতিস্থাপন করবে?
মার্টিন স্মিথ

যথেষ্ট ভাল, আমি টেম্প টেবিলের দিকে যথেষ্ট মনোযোগ দিই নি।
উইলিয়াম_এ_ডিবিএ

1
যাইহোক, অনুমানমূলক সূচীগুলি বাস্তবায়িত পরিকল্পনা কার্যকর করতে পারে। যদি এটি অনুমানমূলক হয় তবে এটিকে বাদ দিয়ে পুনরায় তৈরি করা উচিত। blogs.technet.com/b/anurag_sharma/archive/2008/04/15/...
william_a_dba

হাইপোথিটিকাল ইনডেক্সগুলি বাকি থাকে যখন ডিটিএ শেষ না করে / সমাপ্তির আগে হিমশীতল হয়। ডিটিএর সাথে কোনও হিচকি থাকলে আপনাকে সেগুলি ম্যানুয়ালি পরিষ্কার করতে হবে।
উইলিয়াম_এ_ডিবিএ

1
@ উইলিয়াম_এ_ডিবা - আহ আমি এখন যা বোঝাতে চাইছি (আপনার লিঙ্কটি পড়ার পরে)। ক্রমটি কখনই শেষ হয় না এটি ক্রমাগত সংশোধন করা যেতে পারে। মজাদার!
মার্টিন স্মিথ

1

পরিকল্পনায় সারি সংখ্যা সম্পর্কে আরও তথ্য ছাড়াই, আমার প্রাথমিক সুপারিশটি হ'ল ক্যোয়ারিতে সঠিক যোগদানের ক্রমটির ব্যবস্থা করা এবং এটি ব্যবহার করে জোর করে OPTION (FORCE ORDER)। প্রথম পরিকল্পনার যোগদানের আদেশ কার্যকর করুন।

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