আংশিকভাবে আচ্ছাদিত পরিসীমাটির সাধারণতা অনুমান পূর্বাভাস


13

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

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

পলের উত্তর অনুসারে, পূর্বাভাসগুলি> = এবং> এর জন্য কার্ডিনালিটির অনুমানের সূত্রগুলি (এই ক্ষেত্রে আমি কেবল কমপক্ষে 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 সারি।

দয়া করে আমাকে বলুন, কার্ডিনালিটি এসটিমেটর কীভাবে এই ক্ষেত্রে মূল্যায়ন করে, সম্ভবত উদ্ধৃত সূত্রগুলি বোঝার জন্য আমি কোথাও একটি ভুল করেছি?


SQL সার্ভার 2014 12.0.5 এসপি 2
Ковалёв

উত্তর:


12

এসকিউএল সার্ভার বিভিন্ন পরিস্থিতিতে বিভিন্ন গণনা ব্যবহার করে। আপনার উদাহরণটি লিঙ্কযুক্ত প্রশ্নোত্তর থেকে আলাদা কারণ আপনার পরিসীমা পুরোপুরি এক ধাপের মধ্যে রয়েছে; এটি একটি পদক্ষেপের সীমানা অতিক্রম করে না। এটি একের চেয়ে দুটি প্রান্তের ব্যবধানও। লিখন BETWEENসঙ্গে দুটি পৃথক predicates লেখা হিসাবে একই >=এবং <=

একক পদক্ষেপের মধ্যে দুটি সীমানা সহ অন্তর

সূত্রটি প্রত্যাশিত স্বতন্ত্র মানের সংখ্যার জন্য ধাপের মধ্যে লিনিয়ার ইন্টারপোলেশন সম্পাদন করতে সংশোধন করা হয়েছে এবং প্রতিফলিত করে যে দুটি রেঞ্জের শেষ বিন্দু এখন একের পরিবর্তে নির্দিষ্ট করা হয়েছে (এবং হিস্টগ্রাম ধাপের মধ্যে রয়েছে বলে ধরে নেওয়া হয়েছে)।

প্রশ্নে দেওয়া হিস্টোগ্রাম পদক্ষেপগুলি ব্যবহার করে:

প্রশ্ন হিস্টগ্রাম পদক্ষেপ

এর সাথে ক্যোয়ারির জন্য BETWEEN '20140615' AND '20140616', গণনাটি হ'ল:

DECLARE
    @Q1 float = CONVERT(float, CONVERT(datetime, '2014-06-15')),
    @Q2 float = CONVERT(float, CONVERT(datetime, '2014-06-16')),
    @K1 float = CONVERT(float, CONVERT(datetime, '2014-06-14')),
    @K2 float = CONVERT(float, CONVERT(datetime, '2014-06-18')),
    @RANGE_ROWS float = 301,
    @DISTINCT_RANGE_ROWS float = 3;

DECLARE
    @S1 float = (@Q1 - @K1) / (@K2 - @K1),
    @S2 float = (@Q2 - @K1) / (@K2 - @K1);

DECLARE
    @F float = @S2 - @S1;

DECLARE
    @AVG_RANGE_ROWS float = @RANGE_ROWS / @DISTINCT_RANGE_ROWS;

SELECT
    @AVG_RANGE_ROWS * ((@F * (@DISTINCT_RANGE_ROWS - 2)) + 2);

... 225.75 দিচ্ছে । পরিবর্তন @Q2থেকে '20140616'থেকে '20140617'একটি ফলাফল দেয় 250,833

উভয় ফলাফলই প্রশ্নের সাথে মিলেছে।

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