কেন এই যোগদানের কার্ডিনালিটির প্রাক্কলন এত বড়?


18

আমি মনে করি যা অনুভব করছি নীচের ক্যোয়ারির জন্য একটি অসম্ভব উচ্চ কার্ডিনালিটি অনুমান:

SELECT dm.PRIMARY_ID
FROM
(
    SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_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
) dm
INNER JOIN X_LAST_TABLE lst ON dm.PRIMARY_ID = lst.JOIN_ID;

আনুমানিক পরিকল্পনা এখানে । আমি টেবিলগুলির একটি পরিসংখ্যানের অনুলিপি নিয়ে কাজ করছি যাতে আমি কোনও বাস্তব পরিকল্পনা অন্তর্ভুক্ত করতে পারি না। তবে, আমি মনে করি না যে এটি এই সমস্যার জন্য খুব প্রাসঙ্গিক।

এসকিউএল সার্ভার অনুমান করে যে 481577 সারিগুলি "dm" থেকে প্রাপ্ত টেবিল থেকে ফিরে আসবে। এরপরে এটি অনুমান করে যে 45_8030000 সারি X_LAST_TABLE এ যোগদানের পরে ফিরে আসবে, তবে JOIN_ID হল X_LAST_TIME এর প্রাথমিক কী। আমি 0 এবং 481577 সারিগুলির মধ্যে জোড় কার্ডিনালিটির প্রাক্কলন আশা করব। পরিবর্তে, সারি অনুমানটি বাইরের এবং অভ্যন্তরীণ টেবিলগুলিতে ক্রস করার সময় আমি যে সারিগুলি পেয়েছিলাম তার 10% বলে মনে হয়। এর জন্য গণিতটি গোলাকার সাথে কাজ করে: 481577 * 94025 * 0.1 = 45280277425 যা 4528030000 এ গোল হয়।

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

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

এখানে সর্বাধিক প্রাসঙ্গিক সারণি সংজ্ঞা দেওয়া হল:

CREATE TABLE X_LAST_TABLE (
JOIN_ID NUMERIC(18, 0) NOT NULL
    CONSTRAINT PK_X_LAST_TABLE PRIMARY KEY CLUSTERED (JOIN_ID ASC)
);

আমিও তাদের পরিসংখ্যান সহ টেবিল সৃষ্টি স্ক্রিপ্ট সব আউট স্ক্রিপ্টের কেউ যদি তাদের সার্ভার এক ইস্যু পুনর্গঠন করতে চায়।

আমার কয়েকটি পর্যবেক্ষণ যুক্ত করতে, টিএফ 2312 ব্যবহার করে অনুমানটি ঠিক করা হয় তবে এটি আমার পক্ষে বিকল্প নয়। টিএফ 2301 অনুমানটি ঠিক করে না। টেবিলগুলির মধ্যে একটি সরিয়ে ফেলা অনুমানটি ঠিক করে। উদ্ভট, X_DETAIL_LINK এর যোগদানের ক্রম পরিবর্তন করাও অনুমানটিকে ঠিক করে দেয়। যোগদানের ক্রমটি পরিবর্তন করে আমার অর্থ ক্যোয়ারীটি পুনরায় লেখা এবং কোনও ইঙ্গিত সহ জোড়ের অর্ডার জোর করা নয়। এখানে যোগদানের ক্রমটি পরিবর্তনের সময় একটি আনুমানিক ক্যোয়ারী পরিকল্পনা রয়েছে


PS যদি আপনি কোনও উপায়ে bigintপরিবর্তে স্যুইচ করতে decimal(18, 0)পারেন তবে সুবিধা পাবেন: 1) প্রতিটি মানের জন্য 9 এর পরিবর্তে 8 বাইট ব্যবহার করুন এবং 2) একটি প্যাকড ডেটা টাইপের পরিবর্তে বাইট-তুলনামূলক ডেটা টাইপ ব্যবহার করুন, এতে অন্তর্ভুক্তি থাকতে পারে মানগুলির তুলনা করার সময় সিপিইউ সময়ের জন্য।
এরিক

@ এরিক টিপটির জন্য ধন্যবাদ তবে আমি এটি ইতিমধ্যে জানতাম। দুর্ভাগ্যক্রমে আমরা উত্তরাধিকার কারণে বিগিন্টের উপরে NUMERIC (18,0) এর সাথে আটকে আছি।
জো ওবিশ

এটি একটি শট মূল্য ছিল!
এরিক

আপনার যা দরকার তা না X_DETAIL2এবং X_DETAIL3এ সব টেবিল যদি JOIN_IDএ নাল নয় X_DETAIL1?
এরিক

@ এরিক এটি একটি এমসিভিই তাই ক্যোয়ারীটি এই মুহুর্তে হুবহু বোঝায় না।
জো ওবিশ

উত্তর:


14

আমি জানি যে 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এবং আদর্শভাবে বিদেশী কী এবং কোয়েরি সংকলনের জন্য দরকারী অন্যান্য সীমাবদ্ধতা অন্তর্ভুক্ত।


10

আমি বিশ্বাস করি যে Compute Scalarঅপারেটর এতে COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID)যোগদানের ফলে ফলাফলটি X_LAST_TABLE.JOIN_IDইস্যুটির মূল কারণ। .তিহাসিকভাবে, গণনা স্কেলারগুলি সঠিকভাবে 1 , 2 ব্যয় করা কঠিন হয়ে পড়েছে ।

যেহেতু আপনি সঠিক পরিসংখ্যান সহ একটি ন্যূনতম সম্পূর্ণ যাচাইযোগ্য উদাহরণ (ধন্যবাদ!) সরবরাহ করেছেন, তাই আমি কোয়েরিটি পুনরায় লিখতে সক্ষম হলাম যাতে যোগদানটির আর প্রসারিত CASEকার্যকারিতা প্রয়োজন COALESCEহয় না, ফলস্বরূপ আরও সঠিক সারি অনুমান, এবং সম্ভবত আরও বেশি সঠিক সামগ্রিক ব্যয় শেষে সংযোজন দেখুন। :

SELECT COALESCE(dm.d1ID, dm.d2ID, dm.d3ID)
FROM
(
    SELECT d1ID = d1.JOIN_ID
        , d2ID = d2.JOIN_ID
        , d3ID = 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
) dm
INNER JOIN X_LAST_TABLE lst 
    ON (dm.d1ID IS NOT NULL AND dm.d1ID = lst.JOIN_ID)
    OR (dm.d1ID IS NULL AND dm.d2ID IS NOT NULL AND dm.d2ID = lst.JOIN_ID)
    OR (dm.d1ID IS NULL AND dm.d2ID IS NULL AND dm.d3ID IS NOT NULL AND dm.d3ID = lst.JOIN_ID);

যদিও xID IS NOT NULLপ্রযুক্তিগতভাবে প্রয়োজনীয় নয়, যেহেতু ID = JOIN_IDনাল মানগুলিতে অংশ নেবে না, আমি এগুলি অন্তর্ভুক্ত করেছি কারণ এটি আরও স্পষ্টভাবে উদ্দেশ্যটির চিত্রিত করেছে।

পরিকল্পনা 1 এবং পরিকল্পনা 2

পরিকল্পনা 1:

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

পরিকল্পনা 2:

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

নতুন ক্যোয়ারী সমান্তরালকরণ থেকে (?) উপকার করে। এছাড়াও লক্ষণীয় যে, নতুন ক্যোয়ারিতে 1 টি সারিগুলির একটি অনুমানের আউটপুট সংখ্যা রয়েছে যা প্রকৃত প্রশ্নের জন্য 4528030000 এর অনুমানের চেয়ে দিনের শেষে বাস্তবে খারাপ হতে পারে। নতুন ক্যোয়ারিতে নির্বাচিত অপারেটরের সাবট্রি ব্যয়টি 243210 এ আসে, যখন আসল ঘড়িগুলি 536.535 এ থাকে যা স্পষ্টভাবে কম। এটি বলে, আমি বিশ্বাস করি না যে প্রথম অনুমানটি বাস্তবের কাছাকাছি কোথাও।


সংযোজন ঘ।

@ লামাকের সাথে আলোচনার মাধ্যমে দ্য হিপ-এ বিভিন্ন লোকের সাথে আরও পরামর্শের পরে উত্সাহিত করা হয়েছে যে উপরে আমার পর্যবেক্ষণমূলক প্রশ্নটি সমান্তরালতা সত্ত্বেও ভয়ঙ্করভাবে সম্পাদন করেছে। একটি সমাধান যা ভাল পারফরম্যান্স এবং ভাল কার্ডিনালিটির অনুমান উভয়কেই মঞ্জুরি দেয় যার COALESCE(x,y,z)সাথে একটি প্রতিস্থাপন করে ISNULL(ISNULL(x, y), z):

SELECT dm.PRIMARY_ID
FROM
(
    SELECT ISNULL(ISNULL(d1.JOIN_ID, d2.JOIN_ID), d3.JOIN_ID) PRIMARY_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
) dm
INNER JOIN X_LAST_TABLE lst ON dm.PRIMARY_ID = lst.JOIN_ID;

COALESCECASEক্যোয়ারী অপ্টিমাইজার দ্বারা "কভারগুলির নীচে" একটি বিবৃতিতে রূপান্তরিত হয় । যেমন, কার্ডিনালিটি অনুমানকারীটির ভিতরে কবর দেওয়া কলামগুলির জন্য নির্ভরযোগ্য পরিসংখ্যানগুলি আবিষ্কার করতে আরও কঠিন সময় রয়েছে COALESCEISNULLকার্ডিনালিটির অনুমানের জন্য একটি অভ্যন্তরীণ ফাংশন হওয়া অনেক বেশি "উন্মুক্ত"। ISNULLলক্ষ্যটি অ-অযোগ্য বলে পরিচিত হয়ে উঠলে এটি অপ্টিমাইজ করা যায় এমন কোনও মূল্য নেই ।

ISNULLবৈকল্পিকের জন্য পরিকল্পনাটি দেখে মনে হচ্ছে:

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

(প্ল্যান সংস্করণটি এখানে আটকান )।

এফওয়াইআই, তাদের দুর্দান্ত প্ল্যান এক্সপ্লোরারের জন্য সেন্ট্রি ওয়ানকে প্রপস দেয় , যা আমি উপরের গ্রাফিকাল পরিকল্পনাগুলি তৈরি করতে ব্যবহার করি।


-1

আপনার যোগদানের শর্ত অনুযায়ী, টেবিলটি অনেকগুলি বিন্যাসে সাজানো যেতে পারে, এটি "একটি নির্দিষ্ট পদ্ধতিতে পরিবর্তিত হয়" ফলাফলটি স্থির করে।

মনে করুন যে কেবলমাত্র একটি টেবিলে যোগদান করা আপনাকে সঠিক ফলাফল দেয়।

SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_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

এখানে জায়গায় X_DETAIL_1, আপনি হয় X_DETAIL_2বা ব্যবহার করতে পারেন X_DETAIL_3

সুতরাং বিশ্রামের 2 টি টেবিলের উদ্দেশ্য পরিষ্কার নয়।

এটি এমন যে আপনি টেবিলটি X_DETAIL_1আরও 2 ভাগে ভাগ করেছেন।

খুব সম্ভবত " সেখানে ত্রুটি যেখানে আপনি ঐ টেবিল পূর্ণ করা হয়। " মূলত X_DETAIL_1, X_DETAIL_2এবং X_DETAIL_3সারি সমান পরিমাণ থাকা উচিত।

তবে এক বা একাধিক টেবিলটিতে অনাকাঙ্ক্ষিত সংখ্যক সারি রয়েছে।

আমি ভুল হলে দুঃখিত।

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