এই মুহুর্তে আমি কীভাবে এসকিউএল সার্ভার পরিসীমাটির কার্ডিনালিটির মূল্যায়ন করে তা নির্ধারণের চেষ্টা করছি যা হিস্টগ্রাম ধাপটি আংশিকভাবে কভার করে।
ইন্টারনেটে, কার্ডিনালিটি-অ্যাসেসমেন্টের জন্য এবং ইনট্রা-স্টেপ-স্ট্যাটিস্টিক্স-ভ্যালুতে আমি একই ধরণের প্রশ্নটি দেখতে পেয়েছি এবং পল হোয়াইট এর পরিবর্তে একটি আকর্ষণীয় উত্তর দিয়েছে।
পলের উত্তর অনুসারে, পূর্বাভাসগুলি> = এবং> এর জন্য কার্ডিনালিটির অনুমানের সূত্রগুলি (এই ক্ষেত্রে আমি কেবল কমপক্ষে 120 এর কার্ডিনালিটি অনুমানকারী মডেলটিতে আগ্রহী) এইভাবে:
জন্য>
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1)))
জন্য> =:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1))
আমি এই সূত্র প্রয়োগের পরীক্ষিত [PRODUCTION]। [TransactionHistory] সারণী AdventureWorks2014 ডাটাবেস ব্যবহার সীমার সম্পৃক্ত উপর ভিত্তি করে TransactionDate কলাম মধ্যে '20140614' এবং '20140618' DATETIME পরিসীমা।
এই ব্যাপ্তির হিস্টগ্রাম পদক্ষেপের পরিসংখ্যানগুলি নিম্নরূপ:
সূত্র অনুযায়ী, আমি নিম্নলিখিত প্রশ্নের জন্য কার্ডিনালিটি গণনা করেছি:
SELECT COUNT(1)
FROM [AdventureWorks2014].[Production].[TransactionHistory]
WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000'
নিম্নলিখিত কোড ব্যবহার করে গণনা করা হয়েছিল:
DECLARE @predStart DATETIME = '20140615 00:00:00.000'
DECLARE @predEnd DATETIME = '20140616 00:00:00.000'
DECLARE @stepStart DATETIME = '20140614 00:00:00.000'
DECLARE @stepEnd DATETIME = '20140618 00:00:00.000'
DECLARE @predRange FLOAT = DATEDIFF(ms, @predStart, @predEnd)
DECLARE @stepRange FLOAT = DATEDIFF(ms, @stepStart, @stepEnd)
DECLARE @F FLOAT = @predRange / @stepRange;
DECLARE @avg_range_rows FLOAT = 100.3333
DECLARE @distinct_range_rows INT = 3
DECLARE @EQ_ROWS INT = 0
SELECT @F AS 'F'
--for new cardinality estimator
SELECT @EQ_ROWS + @avg_range_rows * (@F * (@distinct_range_rows - 1) + 1) AS [new_card]
গণনা করার পরে, আমি নিম্নলিখিত ফলাফল পেয়েছি:
সূত্র অনুসারে, এটি 150.5 এ পরিণত হয়েছে, তবে অপ্টিমাইজার 225.75 সারিতে প্রাকটিকটি অনুমান করে এবং আপনি যদি প্রিকটিকের উপরের সীমানাটি '20140617' তে পরিবর্তন করেন তবে অপ্টিমাইজার ইতিমধ্যে 250.833 সারিগুলি মূল্যায়ন করবে, কেবলমাত্র আমাদের সূত্রটি ব্যবহার করার সময় 200.6666 সারি।
দয়া করে আমাকে বলুন, কার্ডিনালিটি এসটিমেটর কীভাবে এই ক্ষেত্রে মূল্যায়ন করে, সম্ভবত উদ্ধৃত সূত্রগুলি বোঝার জন্য আমি কোথাও একটি ভুল করেছি?