এসকিউএল সার্ভারের অপ্টিমাইজার কীভাবে একটি যুক্ত টেবিলের সারিগুলির সংখ্যা অনুমান করে?


13

অ্যাডভেঞ্চার ওয়ার্কস ২০১২ ডাটাবেসে আমি এই ক্যোয়ারীটি চালাচ্ছি :

SELECT 
    s.SalesOrderID,
    d.CarrierTrackingNumber,
    d.ProductID,
    d.OrderQty
FROM Sales.SalesOrderHeader s 
JOIN Sales.SalesOrderDetail d 
    ON s.SalesOrderID = d.SalesOrderID
WHERE s.CustomerID = 11077

যদি আমি আনুমানিক বাস্তবায়ন পরিকল্পনার দিকে নজর রাখি তবে আমি নিম্নলিখিতটি দেখতে পাচ্ছি:

এখানে চিত্র বর্ণনা লিখুন

প্রাথমিক সূচী অনুসন্ধান (উপরের ডানদিকে) IX_SalesOrderHeader_CustomerID সূচকটি ব্যবহার করছে এবং আক্ষরিক ১১০77 on০ অনুসন্ধান করছে 2. এটির একটি অনুমান ২. r১৯২ সারি রয়েছে।

এখানে চিত্র বর্ণনা লিখুন

যদি আমি ব্যবহার করি তবে DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAMএটি দেখায় যে 11077 মান দুটি নমুনাযুক্ত কীগুলি 11019 এবং 11091 এর মধ্যে।

এখানে চিত্র বর্ণনা লিখুন

11019 এবং 11091 এর মধ্যে স্বতন্ত্র সারির গড় সংখ্যা 2.619718, বা ২.19১7272২ গোলাকার, যা সূচকের সন্ধানের জন্য দেখানো আনুমানিক সারিগুলির মান।

আমি যে অংশটি বুঝতে পারি না সেটি হ'ল সেলস অর্ডারডেটেল টেবিলের বিপরীতে ক্লাস্টারড ইনডেক্সের সারিগুলির আনুমানিক সংখ্যা।

এখানে চিত্র বর্ণনা লিখুন

আমি যদি চালাতে পারি DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID'):

এখানে চিত্র বর্ণনা লিখুন

সুতরাং বিক্রয়অর্ডারআইডিটির ঘনত্ব (যার সাথে আমি যোগ দিচ্ছি) হয় 3.178134E-05 05 তার মানে 1 / 3.178134E-05 (31465) বিক্রয় বিক্রয় অর্ডারডেটেল টেবিলের অনন্য বিক্রয় অর্ডারআইডির সংখ্যার সমান।

সেলস অর্ডারডেটেলে যদি 31465 টি স্বতন্ত্র বিক্রয় অর্ডারআইডি থাকে তবে তারপরে এমনকি বিতরণ করার সাথে সাথে সেলস অর্ডারডের প্রতি সারিগুলির গড় সংখ্যা 121313 (সারিগুলির মোট সংখ্যা) 31465 দ্বারা বিভক্ত হয় The গড় হয় 3.85561

সুতরাং যদি লুপটি নির্ধারণের জন্য আনুমানিক সংখ্যাটি 2.61972 হয়, এবং গড়টি 3.85561 এ ফিরে আসে তবে আমি মনে করব যে সারিগুলির আনুমানিক সংখ্যাটি 2.61972 * 3.85561 = 10.10062 হবে।

তবে সারিগুলির আনুমানিক সংখ্যা 11.4867।

আমি মনে করি দ্বিতীয় অনুমান সম্পর্কে আমার বোঝাটি ভুল এবং পৃথক সংখ্যাগুলি এটি সূচিত করে বলে মনে হচ্ছে। আমি কী মিস করছি?

উত্তর:


20

আমি মনে করি দ্বিতীয় অনুমান সম্পর্কে আমার বোঝাটি ভুল এবং পৃথক সংখ্যাগুলি এটি সূচিত করে বলে মনে হচ্ছে। আমি কী মিস করছি?

এসকিউএল সার্ভার ২০১২ কার্ডিনালিটি অনুমানকারী ব্যবহার করে, জোড়ের চূড়ান্তভাবে নেস্টেড লুপগুলির অভ্যন্তরীণ দিকে সারিগুলির আনুমানিক সংখ্যাটি যোগ করে, অন্যদিকে নয়।

11,4867 সংখ্যা উদ্ভূত এর নির্ণিত আনুমানিক cardinality বিভাজক দ্বারা (showplan প্রদর্শন জন্য) পুনরাবৃত্তিও সংখ্যা (2.61972) দ্বারা আউটপুট (30.0919) যোগদান করুন। ফলস্বরূপ, একক-নির্ভুলতা ভাসমান-পয়েন্ট পাটিগণিত ব্যবহার করে, 11.4867

এটা সত্যিই যে হিসাবে সহজ। মনে রাখবেন যে (যৌক্তিক) যোগদানের নির্বাচনটি শারীরিক যোগদান অপারেটরের নির্বাচনের চেয়ে স্বাধীন। যোগদানটি চূড়ান্তভাবে নেস্টেড লুপস, হ্যাশ বা মার্জ জোনের সাথে যুক্ত হয়ে শারীরিক অপারেটর ব্যবহার করে কিনা তা একই থাকে।

এসকিউএল সার্ভার ২০১২ এবং তার আগে, জোড় নির্বাচনের (পুরো হিসাবে) SalesOrderIDপ্রতিটি টেবিল থেকে হিস্টোগ্রামগুলি ব্যবহার করে অনুমান করা হয় (প্রতিটি হিস্টগ্রাম ধাপের জন্য গণনা করা হয়, প্রয়োজনীয় হিসাবে রৈখিক প্রান্তিককরণ ব্যবহার করে ধাপের সীমানা সারিবদ্ধকরণের পরে)। SalesOrderIDসঙ্গে যুক্ত হিস্টোগ্রাম SalesOrderHeaderটেবিল এছাড়াও স্বাধীন স্কেলিং প্রভাবের জন্য স্থায়ী হয় CustomerIDফিল্টার।

তার মানে এই নয় যে প্রশ্নে প্রস্তাবিত বিকল্প গণনার সাথে মূলত 'ভুল' রয়েছে; এটি কেবলমাত্র অনুমানের একটি আলাদা সেট তৈরি করে। যৌক্তিক ক্রিয়াকলাপগুলির প্রদত্ত ক্রমের জন্য অনুমানগুলি গণনা বা সংযুক্ত করার জন্য সর্বদা বিভিন্ন উপায় থাকবে। একই উপাত্তে প্রয়োগ করা বিভিন্ন পরিসংখ্যানগত পদ্ধতিগুলি একই উত্তরগুলি উত্পন্ন করবে বা একটি পদ্ধতি সর্বদা অপরের চেয়ে উচ্চতর হবে এমন কোনও সাধারণ গ্যারান্টি নেই। বিভিন্ন পরিসংখ্যানগত পদ্ধতির প্রয়োগের ফলে তৈরি হওয়া অসঙ্গতিগুলি এমনকি একটিমাত্র চূড়ান্ত কার্যকরকরণ পরিকল্পনার মধ্যে উপস্থিত হতে পারে, যদিও এগুলি খুব কমই লক্ষ্য করা যায়।

পার্শ্ব-নোট হিসাবে, এসকিউএল সার্ভার ২০১৪ কার্ডিনালিটি অনুমানকারী স্বাধীন-ফিল্টার-সমন্বিত হিস্টোগ্রাম তথ্য ( "মোটা প্রান্তিককরণ" ) একত্রিত করার জন্য একটি পৃথক পদ্ধতি গ্রহণ করে , যার ফলস্বরূপ এই কোয়েরির জন্য 10.1006 সারিগুলির একটি পৃথক চূড়ান্ত অনুমান :

Plan for computation:

  CSelCalcExpressionComparedToExpression
  (QCOL: [s].SalesOrderID x_cmpEq QCOL: [d].SalesOrderID)

Loaded histogram for column QCOL: [s].SalesOrderID from stats with id 1
Loaded histogram for column QCOL: [d].SalesOrderID from stats with id 1

Stats collection generated: 

  CStCollJoin(ID=4, **CARD=10.1006** x_jtInner)
      CStCollFilter(ID=3, CARD=2.61972)
          CStCollBaseTable(ID=1, CARD=31465 TBL: Sales.SalesOrderHeader AS TBL: s)
      CStCollBaseTable(ID=2, CARD=121317 TBL: Sales.SalesOrderDetail AS TBL: d)

এটি প্রশ্নের মধ্যে গণনার মতো একই ফলাফল হিসাবে ঘটবে, যদিও বিস্তারিত যুক্তি ভিন্ন (যেমন এটি অনুমান নেস্টেড লুপগুলি বাস্তবায়নের ভিত্তিতে নয়)।

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