আপনার প্রাথমিক ক্যোয়ারির অংশটি নিম্নরূপ।
FROM [dbo].[calendar] a
LEFT JOIN [dbo].[colleagueList] b
ON b.[Date] = a.d
WHERE DAY(a.[d]) = 1
AND a.[d] BETWEEN @dateStart AND COALESCE(@dateEnd,@dateStart)
পরিকল্পনার সেই অংশটি নীচে দেখানো হয়েছে

আপনার সংশোধিত প্রশ্নের BETWEEN @dateStart AND ISNULL(@dateEnd,@dateStart)সাথে একই যোগদানের জন্য এটি রয়েছে

পার্থক্যটি মনে হয় যা ISNULLআরও সরল করে তোলে এবং ফলস্বরূপ আপনি আরও সঠিক কার্ডিনালিটির পরিসংখ্যানগুলি পরবর্তী জোড়ায় যাবেন। এটি একটি ইনলাইন টেবিলের মূল্যবান ফাংশন এবং আপনি এটি আক্ষরিক মান সহ কল করছেন যাতে এটি এর মতো কিছু করতে পারে।
a.[d] BETWEEN @dateStart AND ISNULL(@dateEnd,@dateStart)
a.[d] BETWEEN '2013-06-01' AND ISNULL(NULL,'2013-06-01')
a.[d] BETWEEN '2013-06-01' AND '2013-06-01'
a.[d] = '2013-06-01'
ইক্যুইতে যোগ দেওয়ার পূর্বে হস্তক্ষেপ b.[Date] = a.dকরার পরিকল্পনাটিও সমতার পূর্ববর্তী দেখায় b.[Date] = '2013-06-01'। ফলস্বরূপ 28,393সারিগুলির কার্ডিনালিটির প্রাক্কলনটি সম্ভবত বেশ নির্ভুল হতে পারে।
জন্য CASE/ COALESCEসংস্করণ যখন @dateStartএবং @dateEndএকই মান তারপর, এটা সহজসাধ্য একই সমতা এক্সপ্রেশন ঠিক আছ এবং একই পরিকল্পনা দেয় কিন্তু যখন @dateStart = '2013-06-01'এবং @dateEnd IS NULLএটি শুধুমাত্র যতদূর যায়
a.[d]>='2013-06-01' AND a.[Date]<=CASE WHEN (1) THEN '2013-06-01' ELSE NULL END
এটি এটি একটি অন্তর্নিহিত ভবিষ্যদ্বাণী হিসাবেও প্রযোজ্য ColleagueList। এবার সারিগুলির আনুমানিক সংখ্যা হ'ল 79.8সারি।
পরবর্তী জোড় বরাবর হয়
LEFT JOIN colleagueTime
ON colleagueTime.TC_DATE = colleagueList.Date
AND colleagueTime.ASSOC_ID = CAST(colleagueList.ID AS VARCHAR(10))
colleagueTimeএটি একটি 3,249,590সারি টেবিল যা (আবার) দৃশ্যত কোনও কার্যকর সূচী ছাড়াই apੇਰ।
অনুমানে এই তাত্পর্যটি ব্যবহৃত যোগদানের পছন্দকে প্রভাবিত করে। ISNULLপরিকল্পনা একটি হ্যাশ যোগদানের যে শুধু একবার টেবিল স্ক্যান পছন্দ করে। দ্যCOALESCEপরিকল্পনা একটি নেস্টেড loops যোগদানের বেছে এবং অনুমান যে এটা এখনও শুধু একবার টেবিল স্ক্যান এবং ফলাফলের নাটাই এবং 78 বার রিপ্লে পাবে প্রয়োজন হবে। অর্থাৎ এটি অনুমান করে যে পারস্পরিক সম্পর্কযুক্ত প্যারামিটারগুলি পরিবর্তন হবে না।
নেস্টেড লুপসের পরিকল্পনাটি এখনও দু'ঘন্টা পরেও চলেছিল এই ধরণের বিরুদ্ধে একটি একক স্ক্যানের অনুমান colleagueTime অত্যন্ত অসম্পূর্ণ বলে মনে হচ্ছে।
কেন দুই জনের মধ্যে সারিগুলির আনুমানিক সংখ্যার পরিমাণ এত কম, আমি টেবিলের পরিসংখ্যান দেখতে সক্ষম হওয়া ছাড়া নিশ্চিত নই। আমার পরীক্ষায় অনেকটাই সারি সংখ্যার তুলনায় আনুমানিক সারির সংখ্যাগুলিকে স্ক্যাঙ্ক করার জন্য পরিচালিত একমাত্র উপায় NULL(সারিগুলির আসল সংখ্যা একই থাকলেও এটি অনুমানযুক্ত সারির সংখ্যা হ্রাস পেয়েছে)।
COALESCEআমার পরীক্ষার ডেটা সহ পরিকল্পনার আনুমানিক সারি গণনাটি ছিল
number of rows matching >= condition * 30% * (proportion of rows in the table not null)
অথবা এসকিউএল-এ
SELECT 1E0 * COUNT([Date]) / COUNT(*) * ( COUNT(CASE
WHEN [Date] >= '2013-06-01' THEN 1
END) * 0.30 )
FROM [dbo].[colleagueList]
তবে এটি আপনার মন্তব্যের সাথে বর্গক্ষেত্র নয় যে কলামটির কোনও NULLমূল্য নেই।