আমার একটি ক্যোয়ারী রয়েছে যেখানে ব্যবহারের ফলে select *
কেবলমাত্র কম পড়া হয় না, তবে ব্যবহারের চেয়ে সিপিইউর সময় উল্লেখযোগ্যভাবে কম ব্যবহৃত হয় select c.Foo
।
এটি ক্যোয়ারী:
select top 1000 c.ID
from ATable a
join BTable b on b.OrderKey = a.OrderKey and b.ClientId = a.ClientId
join CTable c on c.OrderId = b.OrderId and c.ShipKey = a.ShipKey
where (a.NextAnalysisDate is null or a.NextAnalysisDate < @dateCutOff)
and b.IsVoided = 0
and c.ComplianceStatus in (3, 5)
and c.ShipmentStatus in (1, 5, 6)
order by a.LastAnalyzedDate
এটি 2,473,658 যৌক্তিক পাঠ সহ শেষ হয়েছে, বেশিরভাগ সারণী বিতে এটি 26,562 সিপিইউ ব্যবহার করে এবং এর মেয়াদকাল 7,965 ছিল।
এটি উত্পন্ন ক্যোয়ারী পরিকল্পনা:
PasteThePlan এ: https://www.brentozar.com/pastetheplan/?id=BJAp2mQIQ
আমি যখন পরিবর্তন c.ID
করি *
, তখন কোয়েরিটি 107,049 লজিকাল রিডের সাথে শেষ হয়েছিল, তিনটি সারণির মধ্যে প্রায় সমানভাবে ছড়িয়ে পড়ে। এটি 4,266 সিপিইউ ব্যবহার করেছে এবং এর মেয়াদ ছিল 1,147।
এটি উত্পন্ন ক্যোয়ারী পরিকল্পনা:
PasteThePlan এ: https://www.brentozar.com/pastetheplan/?id=SyZYn7QUQ
আমি জো ওবিশের পরামর্শযুক্ত ক্যোয়ারী ইঙ্গিতগুলি ব্যবহার করার চেষ্টা করেছি, এই ফলাফলগুলি সহ:
select c.ID
ইঙ্গিত ছাড়াই: https://www.brentozar.com/pastetheplan/?id=SJfBdOELm
select c.ID
ইঙ্গিত সহ: https://www.brentozar.com/pastetheplan/ ? id = B1W ___ N87
select *
ইঙ্গিত ছাড়াই: https://www.brentozar.com/pastetheplan/?id=HJ6qddEIm
select *
ইঙ্গিত সহ: https://www.brentozar.com/pastetheplan/?id=rJhhudNIQ
ব্যবহার OPTION(LOOP JOIN)
সঙ্গে ইঙ্গিতটি select c.ID
আয়তন বহুলাংশে এর ইঙ্গিতটি ছাড়া সংস্করণের সাথে তুলনা পড়া কমিয়ে হয়নি, কিন্তু এটি এখনও 4x সম্পর্কে সংখ্যা করছে সার্চ এর select *
কোনো ইঙ্গিত ছাড়া জিজ্ঞাস্য। যোগ করার পদ্ধতি OPTION(RECOMPILE, HASH JOIN)
থেকে select *
ক্যোয়ারী এটা অনেক খারাপ অন্য কিছু আর আমি চেষ্টা করেছি সঞ্চালন করেন।
টেবিলগুলি এবং তাদের সূচকগুলি ব্যবহার করে পরিসংখ্যান আপডেট করার পরে WITH FULLSCAN
, select c.ID
ক্যোয়ারীটি আরও দ্রুত চলছে:
select c.ID
আপডেটের আগে: https://www.brentozar.com/pastetheplan/?id=SkiYoOEUm
select *
আপডেটের আগে: https://www.brentozar.com/ পেস্টেথপ্লান /? আইডি = রাইরভোডইউএক্স
select c.ID
আপডেটের পরে: https://www.brentozar.com/pastetheplan/?id=B1MRoO487
select *
আপডেটের পরে: https://www.brentozar.com/pastetheplan/?id=Hk7si_V8m
select *
এখনও select c.ID
মোট সময়কাল এবং মোট পাঠের দিক থেকে আরও কার্যকর ( select *
প্রায় অর্ধেক পঠন রয়েছে) তবে এটি আরও সিপিইউ ব্যবহার করে না। সামগ্রিকভাবে তারা আপডেটের তুলনায় অনেক বেশি কাছাকাছি, তবে পরিকল্পনাগুলি এখনও পৃথক।
২০১৪ সালের সামঞ্জস্যতা মোডে এবং ২০১৪ সালে একই আচরণ দেখা যায়। দুটি পরিকল্পনার মধ্যে বৈষম্যকে কী ব্যাখ্যা করতে পারে? এটি কি হতে পারে যে "সঠিক" সূচকগুলি তৈরি করা হয়নি? পরিসংখ্যান কিছুটা পুরানো হয়ে যাওয়ার কারণ হতে পারে?
আমি পূর্বাভাসটিকে ON
একাধিক উপায়ে যোগদানের অংশ পর্যন্ত স্থানান্তরিত করার চেষ্টা করেছি , তবে ক্যোয়ারি প্ল্যান প্রতিবারের মত একই।
সূচকের পুনর্নির্মাণের পরে
আমি ক্যোয়ারীতে জড়িত তিনটি টেবিলে সমস্ত সূচী পুনরায় তৈরি করেছি। c.ID
এখনও সর্বাধিক পঠন করছে (দ্বিগুণেরও বেশি *
), তবে সিপিইউ ব্যবহারটি *
সংস্করণের প্রায় অর্ধেক । c.ID
সংস্করণ এছাড়াও শ্রেণীবিভাজন উপর tempdb মধ্যে চিত্তভ্রংশ ATable
:
c.ID
: https://www.brentozar.com/pastetheplan/?id=HyHIeDO87
*
: https://www.brentozar.com/pastetheplan/?id=rJ4deDOIQ
আমি এটিকে সমান্তরালতা ছাড়াই পরিচালিত করার জন্য জোর করেও চেষ্টা করেছি এবং এটি আমাকে সেরা পারফরম্যান্স ক্যোয়ারী দিয়েছে: https://www.brentozar.com/pastetheplan/?id=SJn9-vuLX
আমি বড় সূচকগুলির অনুসন্ধানের পরে অপারেটরদের মৃত্যুদন্ড গণনা করেছি যা কেবলমাত্র একক থ্রেডেড সংস্করণে এক হাজার বার কার্যকর করা অর্ডার করছে, তবে সমান্তরাল সংস্করণে বিভিন্ন অপারেটরের ২,6২২ থেকে ৪,৩১৫ টি ফাঁসির মধ্যে উল্লেখযোগ্যভাবে আরও কিছু করেছে।
select c.ID
ক্যোয়ারীটিকে আরও দ্রুত তৈরি করেছে তবে এটি এখনও কিছু অতিরিক্ত কাজ করছে যাselect *
কোয়েরিটি, ইঙ্গিত ছাড়াই করে।