আমি জানি যে COALESCE
কয়েকটি কলামে করা এবং সেগুলিতে যোগদান করা একটি ভাল অনুশীলন নয়।
যখন স্কিমা 3NF + (কী এবং সীমাবদ্ধতা সহ) থাকে তখন ভাল কার্ডিনালিটি এবং বিতরণ অনুমান উত্পাদন করা যথেষ্ট শক্ত এবং কোয়েরিটি আপেক্ষিক এবং মূলত এসপিজেজি (নির্বাচন-প্রজেকশন-জয়েন-গ্রুপ দ্বারা)। সিই মডেলটি সেই নীতিগুলিতে নির্মিত। কোয়েরিতে আরও অস্বাভাবিক বা অ-সম্পর্কযুক্ত বৈশিষ্ট্যগুলি, কার্ডিনালিটি এবং সিলেকটিভিটির কাঠামোটি কী পরিচালনা করতে পারে তার সীমাতে ঘনিষ্ঠ হয়ে যায়। খুব দূরে যান এবং সিই ছেড়ে দেবে এবং অনুমান করবে ।
বেশিরভাগ এমসিভিই উদাহরণ হ'ল সহজ এসপিজে (কোনও জি) নয়, তবে মূল অভ্যন্তরীণ ইকিজোইন (বা সেমিজাইন) এর চেয়ে মূলত বহিরাগত ইকুইজাইনস (অভ্যন্তরীণ জোড় প্লাস অ্যান্টি-সেমিজাইন হিসাবে মডেলিং) হয়ে থাকে। সমস্ত সম্পর্কের কী রয়েছে, যদিও বিদেশী কী বা অন্যান্য বাধা নেই। জয়েনদের মধ্যে একটি ছাড়া সবগুলিই এক থেকে অনেকগুলি হয়, যা ভাল।
ব্যতিক্রমটি বহু-বহু বহিরাগত জোড় X_DETAIL_1
এবং এর মধ্যে X_DETAIL_LINK
। MCVE এ যোগদানের একমাত্র কাজটি হ'ল সম্ভাব্যভাবে সারিগুলিকে সদৃশ করা X_DETAIL_1
। এটি একটি জিনিসের একটি অস্বাভাবিক ধরণের।
সাধারণ সমতার পূর্বাভাস (নির্বাচন) এবং স্কেলার অপারেটরগুলি আরও ভাল। উদাহরণস্বরূপ বৈশিষ্ট্য তুলনা-সমান গুণাবলী / ধ্রুবক সাধারণত মডেলটিতে ভাল কাজ করে। এই জাতীয় পূর্বাভাসের প্রয়োগকে প্রতিফলিত করার জন্য হিস্টোগ্রাম এবং ফ্রিকোয়েন্সি পরিসংখ্যান সংশোধন করা তুলনামূলকভাবে "সহজ"।
COALESCE
বিল্ট CASE
ইন, যা ঘুরিয়ে হিসাবে অভ্যন্তরীণভাবে প্রয়োগ করা হয়IIF
(এবং IIF
এটি লেনদেন-এসকিউএল ভাষায় প্রদর্শিত হওয়ার আগে সত্যই ছিল )। সিই মডেল IIF
হিসেবে UNION
দুই পারস্পরিক একচেটিয়া শিশুদের সঙ্গে, প্রতিটি ইনপুট সম্পর্ক একটি নির্বাচনের উপর একটি প্রকল্প গঠিত। তালিকাভুক্ত প্রতিটি উপাদানের মডেল সমর্থন রয়েছে, সুতরাং তাদের সংমিশ্রণ তুলনামূলকভাবে সোজা। তবুও, আরও একটি স্তর বিমূর্ততা, শেষের ফলাফল যত কম নির্ভুল হয় - বৃহত্তর সম্পাদন পরিকল্পনা কম স্থিতিশীল এবং নির্ভরযোগ্য হওয়ার কারণ a
ISNULL
অন্যদিকে, ইঞ্জিনের মধ্যে অন্তর্নিহিত । এটি আর কোনও মৌলিক উপাদান ব্যবহার করে নির্মিত হয় না। এর প্রভাব প্রয়োগ করা হচ্ছেISNULL
একটি হিস্টোগ্রামের , উদাহরণস্বরূপ, NULL
মানগুলির জন্য ধাপটি প্রতিস্থাপন করা (এবং প্রয়োজনীয় হিসাবে কমপ্যাক্ট করা) হিসাবে সহজ । এটি এখনও অপেক্ষাকৃত অস্বচ্ছ, স্কেলার অপারেটররা যেহেতু যায়, এবং যেখানে সম্ভব সেখানে এড়ানো ভাল। তবুও, এটি সাধারণত CASE
ভিত্তিক বিকল্পের চেয়ে বেশি অপ্টিমাইজার-বান্ধব (কম অপ্টিমাইজার-বন্ধুত্বপূর্ণ) বলছে ।
সিই (70 এবং 120+) হ'ল খুব জটিল, এমনকি এসকিউএল সার্ভার মানক দ্বারাও। এটি প্রতিটি অপারেটরের কাছে সাধারণ লজিক (একটি গোপন সূত্র সহ) প্রয়োগ করার ঘটনা নয়। সিই কী এবং কার্যকরী নির্ভরতা সম্পর্কে জানে; এটি কীভাবে ফ্রিকোয়েন্সি, মাল্টিভারিয়েট পরিসংখ্যান এবং হিস্টোগ্রামগুলি ব্যবহার করে অনুমান করতে হয় তা জানে; এবং এখানে বিশেষ কেস, পরিশোধন, চেক এবং ভারসাম্য এবং সমর্থনকারী কাঠামোর একটি নিখুঁত পরিমাণ রয়েছে। এটি প্রায়শই অনুমান করে যে উদাহরণস্বরূপ একাধিক উপায়ে (ফ্রিকোয়েন্সি, হিস্টোগ্রাম) যোগদান করে এবং উভয়ের মধ্যে পার্থক্যের ভিত্তিতে ফলাফল বা সমন্বয় স্থির করে।
কভার করার জন্য একটি সর্বশেষ প্রাথমিক বিষয়: প্রাথমিক কার্ডিনালিটির অনুমান নীচে থেকে কোয়েরি ট্রিটিতে প্রতিটি ক্রিয়াকলাপের জন্য চলে। নির্বাচন এবং কার্ডিনালিটি পাতার অপারেটরগুলির জন্য প্রথমে উত্পন্ন (বেস সম্পর্ক)। পরিবর্তিত হিস্টোগ্রাম এবং ঘনত্ব / ফ্রিকোয়েন্সি তথ্য প্যারেন্ট অপারেটরদের জন্য উত্পন্ন। আমরা যে গাছটি আরও উপরে যাব ততই গুণমানের অনুমানের পরিমাণ ত্রুটিগুলি জমা হওয়ার প্রবণতা হিসাবে দেখা দেয়।
এই একক প্রাথমিক বিস্তৃত অনুমানটি একটি প্রারম্ভিক বিন্দু সরবরাহ করে এবং চূড়ান্ত সম্পাদন পরিকল্পনার বিষয়ে কোনও বিবেচনা দেওয়ার আগে এটি ভাল হয় (এটি তুচ্ছ পরিকল্পনা সংকলনের পর্যায়ে যাওয়ার আগেও ঘটে)। এই মুহুর্তে ক্যোরি ট্রিটি ক্যোয়ারির লিখিত ফর্মটি প্রায় কাছাকাছিভাবে প্রতিবিম্বিত করে (যদিও সাবকিউরিজগুলি সরানো হয়েছে, এবং সরলীকরণ প্রয়োগ করা হয়েছে ইত্যাদি)
প্রাথমিক অনুমানের অবিলম্বে, এসকিউএল সার্ভার হিউরিস্টিক জয়েন পুনর্নির্মাণ সম্পাদন করে, যা আলগাভাবে কথা বললে গাছটিকে ছোট ছোট টেবিলগুলি রাখার চেষ্টা করে এবং উচ্চ-নির্বাচনের সাথে প্রথমে যোগ দেয়। এটি বাহ্যিক যোগদান এবং ক্রস পণ্যগুলির আগে অভ্যন্তরীণ যোগদানের স্থানেও চেষ্টা করে। এর ক্ষমতাগুলি ব্যাপক নয়; এর প্রচেষ্টা নিখরচায় নয়; এবং এটি শারীরিক ব্যয় বিবেচনা করে না (যেহেতু তারা এখনও বিদ্যমান নেই - কেবলমাত্র পরিসংখ্যান সম্পর্কিত তথ্য এবং মেটাডেটা তথ্য উপস্থিত রয়েছে)। সরল অভ্যন্তরীণ ইকুইজাইন গাছগুলিতে হিউরিস্টিক পুনঃক্রমটি সবচেয়ে সফল। এটি ব্যয়ভিত্তিক অপ্টিমাইজেশনের জন্য "আরও ভাল" শুরুর পয়েন্ট সরবরাহ করার জন্য বিদ্যমান।
কেন এই যোগদানের কার্ডিনালিটির প্রাক্কলন এত বড়?
MCVE এর একটি "অসাধারণ" বেশিরভাগ-রিডানড্যান্ট বহু-থেকে-বহু লোক যোগদান করে, এবং একটি ইক্যুই প্রিকিকেটে যোগ COALESCE
দেয়। অপারেটর ট্রিটিতে সর্বশেষ অভ্যন্তরীণ যোগও রয়েছে, যা প্রত্নতাত্ত্বিক জোড় পুনরায় ক্রমটি গাছটিকে আরও পছন্দসই অবস্থানে নিয়ে যেতে অক্ষম। সমস্ত স্কেলার এবং অনুমানগুলি বাদ দিয়ে জোড় গাছটি হ'ল:
LogOp_Join [ Card=4.52803e+009 ]
LogOp_LeftOuterJoin [ Card=481577 ]
LogOp_LeftOuterJoin [ Card=481577 ]
LogOp_LeftOuterJoin [ Card=481577 ]
LogOp_LeftOuterJoin [ Card=481577 ]
LogOp_Get TBL: X_DRIVING_TABLE(alias TBL: dt) [ Card=481577 ]
LogOp_Get TBL: X_DETAIL_1(alias TBL: d1) [ Card=70 ]
LogOp_Get TBL: X_DETAIL_LINK(alias TBL: lnk) [ Card=47 ]
LogOp_Get TBL: X_DETAIL_2(alias TBL: d2) X_DETAIL_2 [ Card=119 ]
LogOp_Get TBL: X_DETAIL_3(alias TBL: d3) X_DETAIL_3 [ Card=281 ]
LogOp_Get TBL: X_LAST_TABLE(alias TBL: lst) X_LAST_TABLE [ Card=94025 ]
ত্রুটিযুক্ত চূড়ান্ত প্রাক্কলন ইতিমধ্যে স্থানে নোট করুন। এটি Card=4.52803e+009
ডাবল নির্ভুলতা ভাসমান পয়েন্টের মান হিসাবে 4.5280277425e + 9 (দশমিক 4528027742.5) হিসাবে অভ্যন্তরীণভাবে মুদ্রিত এবং সংরক্ষণ করা হয়।
মূল ক্যোয়ারিতে উত্পন্ন টেবিলটি সরানো হয়েছে, এবং অনুমানগুলি স্বাভাবিক করা হয়েছে। গাছটির একটি এসকিউএল উপস্থাপনা, যার উপর প্রাথমিক কার্ডিনালিটি এবং নির্বাচন সংক্রান্ত অনুমান করা হয়েছিল:
SELECT
PRIMARY_ID = COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID)
FROM X_DRIVING_TABLE dt
LEFT OUTER JOIN X_DETAIL_1 d1
ON dt.ID = d1.ID
LEFT OUTER JOIN X_DETAIL_LINK lnk
ON d1.LINK_ID = lnk.LINK_ID
LEFT OUTER JOIN X_DETAIL_2 d2
ON dt.ID = d2.ID
LEFT OUTER JOIN X_DETAIL_3 d3
ON dt.ID = d3.ID
INNER JOIN X_LAST_TABLE lst
ON lst.JOIN_ID = COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID)
(একপাশে হিসাবে, পুনরাবৃত্তি COALESCE
চূড়ান্ত পরিকল্পনায়ও উপস্থিত থাকে - একবার চূড়ান্ত গণনা স্কেলারে এবং একবার অভ্যন্তরের অভ্যন্তরের দিকে)।
চূড়ান্ত যোগদানের লক্ষ করুন। এই অভ্যন্তরীণ যোগটি হ'ল (সংজ্ঞা অনুসারে) কার্টেসিয়ান পণ্য X_LAST_TABLE
এবং পূর্ববর্তী যোগদানের আউটপুট, lst.JOIN_ID = COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID)
প্রয়োগের একটি নির্বাচনের (প্রাকটিকেটে যোগ দিন) সাথে । কার্টেসিয়ান পণ্যটির কার্ডিনালিটি কেবল 481577 * 94025 = 45280277425।
এটির জন্য, আমাদের প্রিডিকেটের সিলেকটিভিটি নির্ধারণ এবং প্রয়োগ করতে হবে। অস্বচ্ছ প্রসারিত COALESCE
গাছের সংমিশ্রণ (শর্তাবলীর সাথে UNION
এবং IIF
মনে রাখবেন) একসাথে মূল তথ্যের উপর প্রভাব, উত্পন্ন হিস্টোগ্রাম এবং ফ্রিকোয়েন্সি পূর্ববর্তী "অস্বাভাবিক" বেশিরভাগ-অপ্রয়োজনীয় অনেকগুলি থেকে বহু বহিরাগত সংযুক্তির অর্থ সিই করতে অক্ষম সাধারণ যে কোনও একটিতে একটি গ্রহণযোগ্য অনুমান পাওয়া।
ফলস্বরূপ, এটি অনুমান যুক্তিতে প্রবেশ করে। অনুমানের যুক্তি মাঝারিভাবে জটিল, "শিক্ষিত" অনুমানের স্তরগুলির সাথে এবং "এত শিক্ষিত নয়" অনুমানের অ্যালগোরিদম চেষ্টা করে। যদি অনুমানের জন্য আরও ভাল ভিত্তি না পাওয়া যায় তবে মডেলটি শেষ অবলম্বনের একটি অনুমান ব্যবহার করে যা সমতার তুলনায়: sqllang!x_Selectivity_Equal
= স্থির 0.1 নির্বাচন (10% অনুমান):
-- the moment of doom
movsd xmm0,mmword ptr [sqllang!x_Selectivity_Equal
ফলাফলটি কার্টেসিয়ান পণ্যগুলিতে 0.1 নির্বাচনের: 481577 * 94025 * 0.1 = 4528027742.5 (~ 4.52803e + 009) পূর্বে উল্লিখিত হিসাবে।
নতুন করে লেখা হয়
যখন সমস্যাযুক্ত যোগদানের মন্তব্য করা হয় , তখন একটি আরও ভাল প্রাক্কলন উত্পন্ন হয় কারণ স্থির-চূড়ান্ত "শেষ অবলম্বনের অনুমান" এড়ানো হয় (মূল তথ্যটি 1-এম যোগদান করে)। অনুমানের গুণমানটি এখনও কম আত্মবিশ্বাসের, কারণ একটি COALESCE
জয়েন্ট প্রিকেটিক মোটেও সিই-বান্ধব নয়। সংশোধিত হিসাব অন্তত আছে বর্ণন মানুষের অধিক যুক্তিসঙ্গত, আমি অনুমান।
যখন ক্যোয়ারীটি বহির্মুখী জোড় X_DETAIL_LINK
দিয়ে শেষের স্থানে লেখা হয় , তখন হিউরিস্টিক পুনঃক্রমটি চূড়ান্ত অভ্যন্তরীণ জোড়ায় এটি অদলবদল করতে সক্ষম হয় X_LAST_TABLE
। বাহ্যিক যোগদানের সমস্যার ঠিক পাশের অভ্যন্তরীণ জোড় স্থাপন করা চূড়ান্ত পুনর্নির্মাণের সীমিত সামর্থ্যগুলিকে চূড়ান্ত অনুমানের উন্নতি করার সুযোগ দেয়, কারণ বেশিরভাগ-অপ্রয়োজনীয় "অস্বাভাবিক" বহু থেকে বহু বহিরাগত যোগদানের প্রভাবগুলি ছদ্মবেশী নির্বাচনের অনুমানের পরে আসে জন্য COALESCE
। আবার, অনুমানগুলি স্থির অনুমানের তুলনায় কিছুটা ভাল, সম্ভবত কোনও আইন আদালতে ক্রস-পরীক্ষার জন্য দাঁড়াবে না।
অভ্যন্তরীণ এবং বাহ্যিক মিশ্রণের মিশ্রণটি পুনরায় সাজানো কঠোর এবং সময়সাপেক্ষ (এমনকি দ্বিতীয় পর্যায়ে সম্পূর্ণ অপ্টিমাইজেশান শুধুমাত্র তাত্ত্বিক পদক্ষেপের একটি সীমিত উপসেট চেষ্টা করে)।
ISNULL
ম্যাক্স ভার্ননের উত্তরে প্রস্তাবিত নেস্টেড জামিন-বহির্ভূত নির্ধারিত অনুমান এড়াতে পরিচালিত করে, তবে চূড়ান্ত অনুমানটি একটি অসম্ভব শূন্য সারি (শালীনতার জন্য এক সারিতে উন্নীত)। এটি একই সাথে 1 সারির একটি নির্দিষ্ট অনুমানও হতে পারে, সমস্ত পরিসংখ্যানের ভিত্তিতে গণনা রয়েছে।
আমি 0 এবং 481577 সারিগুলির মধ্যে জোড় কার্ডিনালিটির প্রাক্কলন আশা করব।
এটি একটি যুক্তিসঙ্গত প্রত্যাশা, এমনকি যদি কেউ গ্রহণ করে যে শারীরিক মূল্যায়ন বিভিন্ন সময়ে (ব্যয়ভিত্তিক অপ্টিমাইজেশনের সময়) শারীরিকভাবে পৃথক হতে পারে তবে যৌক্তিকভাবে এবং শব্দার্থগতভাবে অভিন্ন সাবট্রিজগুলিতে - চূড়ান্ত পরিকল্পনাটি এক প্রকারের সেলাই-একসাথে সেরা হয়ে থাকে সেরা (প্রতি মেমো গ্রুপ) পরিকল্পনা-প্রশস্ত সুসংগত গ্যারান্টিটির অভাবের অর্থ এই নয় যে কোনও ব্যক্তি যোগদানের কারণে শ্রদ্ধার সঞ্চার করা উচিত, আমি তা পেয়েছি।
অন্যদিকে, যদি আমরা শেষ অবলম্বনের অনুমানটি শেষ করি তবে আশা ইতিমধ্যে হারিয়ে গেছে, তবে কেন বিরক্ত করবেন। আমরা জানি আমাদের সমস্ত কৌশল চেষ্টা করেছিলাম এবং ছেড়ে দিয়েছি। অন্য কিছু না হলে, ওয়াইল্ড চূড়ান্ত প্রাক্কলনটি একটি দুর্দান্ত সতর্কতা চিহ্ন যা এই কোয়েরির সংকলন এবং অপ্টিমাইজেশনের সময় সমস্ত কিছুই সিই এর ভিতরে ভালভাবে যায় নি।
আমি যখন এমসিভিই চেষ্টা করেছি, তখন 120+ সিই ISNULL
মূল ক্যোয়ারির জন্য শূন্য (= 1) সারি চূড়ান্ত প্রাক্কলন তৈরি করেছিল (নেস্টেডের মতো ), যা আমার চিন্তাভাবনার পক্ষে ঠিক অগ্রহণযোগ্য।
আসল সমাধানটি সম্ভবত একটি নকশা পরিবর্তনের সাথে জড়িত, যাতে COALESCE
বা না ছাড়াই সাধারণ ইক্যুই-যোগ দেয় ISNULL
এবং আদর্শভাবে বিদেশী কী এবং কোয়েরি সংকলনের জন্য দরকারী অন্যান্য সীমাবদ্ধতা অন্তর্ভুক্ত।
bigint
পরিবর্তে স্যুইচ করতেdecimal(18, 0)
পারেন তবে সুবিধা পাবেন: 1) প্রতিটি মানের জন্য 9 এর পরিবর্তে 8 বাইট ব্যবহার করুন এবং 2) একটি প্যাকড ডেটা টাইপের পরিবর্তে বাইট-তুলনামূলক ডেটা টাইপ ব্যবহার করুন, এতে অন্তর্ভুক্তি থাকতে পারে মানগুলির তুলনা করার সময় সিপিইউ সময়ের জন্য।