কেন ঘোষিত যোগদানের কলাম আদেশ পরিবর্তন করে একটি সাজানোর প্রবর্তন করে?


40

আমার দুটি টেবিল রয়েছে যাতে নামযুক্ত, টাইপযুক্ত এবং সূচিবদ্ধ কী কলামগুলি রয়েছে। এর মধ্যে একটিতে একটি অনন্য ক্লাস্টারযুক্ত সূচক রয়েছে, অন্যটির একটি অনন্য

পরীক্ষা সেটআপ

কিছু বাস্তবসম্মত পরিসংখ্যান সহ সেটআপ স্ক্রিপ্ট:

DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;

CREATE TABLE #left (
    a       char(4) NOT NULL,
    b       char(2) NOT NULL,
    c       varchar(13) NOT NULL,
    d       bit NOT NULL,
    e       char(4) NOT NULL,
    f       char(25) NULL,
    g       char(25) NOT NULL,
    h       char(25) NULL
    --- and a few other columns
);

CREATE UNIQUE CLUSTERED INDEX IX ON #left (a, b, c, d, e, f, g, h)

UPDATE STATISTICS #left WITH ROWCOUNT=63800000, PAGECOUNT=186000;

CREATE TABLE #right (
    a       char(4) NOT NULL,
    b       char(2) NOT NULL,
    c       varchar(13) NOT NULL,
    d       bit NOT NULL,
    e       char(4) NOT NULL,
    f       char(25) NULL,
    g       char(25) NOT NULL,
    h       char(25) NULL
    --- and a few other columns
);

CREATE CLUSTERED INDEX IX ON #right (a, b, c, d, e, f, g, h)

UPDATE STATISTICS #right WITH ROWCOUNT=55700000, PAGECOUNT=128000;

তিরস্কার

আমি যখন তাদের ক্লাস্টারিং কীগুলিতে এই দুটি টেবিলগুলিতে যোগদান করি তখন আমি এক-একাধিক MERGE যোগদানের আশা করি, এরকম:

SELECT *
FROM #left AS l
LEFT JOIN #right AS r ON
    l.a=r.a AND
    l.b=r.b AND
    l.c=r.c AND
    l.d=r.d AND
    l.e=r.e AND
    l.f=r.f AND
    l.g=r.g AND
    l.h=r.h
WHERE l.a='2018';

এটি আমি চাই ক্যোয়ারী পরিকল্পনা:

এটাই আমি চাই.

(সতর্কবাণীগুলি মনে রাখবেন না, তাদের জাল পরিসংখ্যানগুলির সাথে করতে হবে))

যাইহোক, আমি যোগদানের আশেপাশে কলামগুলির ক্রম পরিবর্তন করি তবে এটির মতো:

SELECT *
FROM #left AS l
LEFT JOIN #right AS r ON
    l.c=r.c AND     -- used to be third
    l.a=r.a AND     -- used to be first
    l.b=r.b AND     -- used to be second
    l.d=r.d AND
    l.e=r.e AND
    l.f=r.f AND
    l.g=r.g AND
    l.h=r.h
WHERE l.a='2018';

... এটা ঘটেছে:

যোগদানের ক্ষেত্রে ঘোষিত কলামের আদেশ পরিবর্তন করার পরে ক্যোয়ারী পরিকল্পনা।

বাছাই করা অপারেটর যোগদানের ঘোষিত আদেশ অনুযায়ী স্ট্রিমগুলি অর্ডার করে বলে মনে হচ্ছে c, a, b, d, e, f, g, h, যা আমার ক্যোয়ারী পরিকল্পনায় একটি ব্লকিং অপারেশন যুক্ত করে।

আমি যে বিষয়গুলি দেখেছি

  • আমি কলামগুলি NOT NULLএকই ফলাফলগুলিতে পরিবর্তন করার চেষ্টা করেছি ।
  • মূল সারণীটি ANSI_PADDING OFFতৈরি করা হয়েছিল , তবে এটি তৈরি করা ANSI_PADDING ONএই পরিকল্পনাকে প্রভাবিত করে না।
  • এর INNER JOINপরিবর্তে আমি চেষ্টা করেছি LEFT JOIN, কোনও পরিবর্তন নেই।
  • আমি এটি একটি 2014 এসপি 2 এন্টারপ্রাইজে আবিষ্কার করেছি, একটি 2017 বিকাশকারী (বর্তমান সিইউ) -এ একটি প্রতিস্থাপন তৈরি করেছি।
  • শীর্ষস্থানীয় সূচী কলামে WHERE ধারাটি অপসারণ করা ভাল পরিকল্পনা তৈরি করে, তবে এটি ধরণের ফলাফলগুলিকে প্রভাবিত করে .. :)

অবশেষে, আমরা প্রশ্ন পেতে

  • এটা কি ইচ্ছাকৃত?
  • আমি কি ক্যোয়ারী পরিবর্তন না করেই বাছাই করতে পারি (যা ভেন্ডার কোড, তাই আমি আসলেই বরং চাইতাম না ...)। আমি টেবিল এবং সূচকগুলি পরিবর্তন করতে পারি।

উত্তর:


28

এটা কি ইচ্ছাকৃত?

এটি নকশা দ্বারা, হ্যাঁ। এসকিউএল সার্ভার টিমের বিকাশকারীদের কাছ থেকে অনেক দরকারী মন্তব্য বর্জন করে মাইক্রোসফ্ট কানেক্ট ফিডব্যাক সাইটটি অবসর নেওয়ার পরে দুর্ভাগ্যক্রমে এই দৃ for়তার জন্য সর্বজনীন উত্সটি হারিয়ে গিয়েছিল।

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

তবুও, অপ্রয়োজনীয় বাছাই এড়ানোতে অপ্টিমাইজারটি বেশ ভাল (অনেক ক্ষেত্রে), তবে এই ফলাফলটি সাধারণত আক্রমণাত্মকভাবে বিভিন্ন ক্রম সংক্রমণের চেষ্টা ছাড়া অন্য কারণগুলির জন্য ঘটে। সেই অর্থে এটি 'অনুসন্ধান স্পেস' নিয়ে তেমন প্রশ্নই আসে না কারণ এটি অर्थোগোনাল অপটিমাইজার বৈশিষ্ট্যগুলির মধ্যে জটিল মিথস্ক্রিয়া যা গ্রহণযোগ্য ব্যয়ে সাধারণ পরিকল্পনার মান বাড়িয়ে দেখানো হয়েছে।

উদাহরণস্বরূপ, প্রায়শই ORDER BYকোনও বিদ্যমান সূচকের সাথে অর্ডারিং প্রয়োজনীয়তার (যেমন শীর্ষ স্তরের ) সাথে মিল রেখে বাছাই করা এড়ানো যায় । তুচ্ছভাবে আপনার ক্ষেত্রে যুক্ত হওয়ার অর্থ হতে পারে ORDER BY l.a, l.b, l.c, l.d, l.e, l.f, l.g, l.h;তবে এটি একটি অতি- সরলকরণ (এবং আপনি কোয়েরিটি পরিবর্তন করতে চান না বলেই অগ্রহণযোগ্য)।

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

আপনার নির্দিষ্ট ক্ষেত্রে, হ্যাঁ, আপনি জ্যাডারনেল 27 ক্রম এড়ানোর পরামর্শ হিসাবে সূচীটি ঠিক করতে পারেন ; যদিও এখানে আসলে একত্রীকরণকে পছন্দ করার সামান্য কারণ রয়েছে। আপনি OPTION(HASH JOIN, LOOP JOIN)ডেটা সম্পর্কে আপনার জ্ঞানের উপর নির্ভর করে, কোয়েরি পরিবর্তন না করে প্ল্যান গাইড ব্যবহার করে হ্যাশ বা লুপ শারীরিক যোগদানের মধ্যে কোনও পছন্দকে ইঙ্গিত করতে পারেন , এবং সেরা, সবচেয়ে খারাপ এবং গড় ক্ষেত্রে পারফরম্যান্সের মধ্যে ট্রেড অফ করতে পারেন।

অবশেষে, কৌতূহল হিসাবে নোট করুন যে ORDER BY l.bসম্ভাব্যভাবে কম দক্ষ অনেকগুলি থেকে বহু সংখ্যক একীভূত করে bএকটি জটিল অবশিষ্টাংশের সাথে একচেটিয়া যোগ দিতে ব্যয় করে সর্টগুলি এড়ানো যায় । আমি এটি বেশিরভাগই পূর্বে উল্লিখিত অপটিমাইজার বৈশিষ্ট্যগুলির মধ্যে মিথস্ক্রিয়াটির উদাহরণ হিসাবে এবং শীর্ষ স্তরের প্রয়োজনীয়তা যেভাবে প্রচার করতে পারি তা উল্লেখ করি।


19

আমি কি ক্যোয়ারী পরিবর্তন না করেই বাছাই করতে পারি (যা ভেন্ডার কোড, তাই আমি আসলেই বরং চাইতাম না ...)। আমি টেবিল এবং সূচকগুলি পরিবর্তন করতে পারি।

আপনি যদি সূচকগুলি পরিবর্তন করতে পারেন তবে জোড়ের #rightমধ্যে ফিল্টারগুলির ক্রমের সাথে তালিকার সাথে তালিকার ক্রম পরিবর্তন করা সারণিটিকে সরিয়ে দেয় (আমার জন্য):

CREATE CLUSTERED INDEX IX ON #right (c, a, b, d, e, f, g, h)

আশ্চর্যজনকভাবে (আমার কাছে, কমপক্ষে), এর ফলাফলগুলি কোয়েরিতেও বাছাই করে না বাছাই করে।

এটা কি ইচ্ছাকৃত?

কিছু অদ্ভুত ট্রেস পতাকা থেকে আউটপুটটি দেখলে চূড়ান্ত মেমো কাঠামোর মধ্যে একটি আকর্ষণীয় পার্থক্য রয়েছে:

প্রতিটি প্রশ্নের জন্য চূড়ান্ত মেমো কাঠামোর স্ক্রিনশট

আপনি উপরের "রুট গ্রুপ" তে দেখতে পাচ্ছেন, উভয় প্রশ্নের কাছে এই কোয়েরিটি সম্পাদন করার জন্য প্রধান শারীরিক ক্রিয়াকলাপ হিসাবে মার্জ জয়েন ব্যবহার করার বিকল্প রয়েছে।

ভাল জিজ্ঞাসা

যোগদানের ছাড়া সাজানোর গ্রুপ দ্বারা চালিত হয় 29 বিকল্প 1 এবং গ্রুপ 31 বিকল্প 1 (প্রতিটি যা জড়িত ইনডেক্স পরিসরের মধ্যে স্ক্যান আছে)। এটি 27 টি গ্রুপ দ্বারা ফিল্টার করা হয়েছে (দেখানো হয়নি), যা যুক্তিকে ফিল্টার করে লজিক্যাল তুলনা ক্রিয়াকলাপ।

খারাপ জিজ্ঞাসা

এক সঙ্গে সাজানোর (নতুন) অপশন 3 ঐ দুই দলের (29 এবং 31) প্রতিটি আছে যা দ্বারা চালিত হয়। বিকল্প 3 পূর্বে উল্লিখিত ব্যাপ্তি স্ক্যানগুলির ফলাফলগুলিতে একটি শারীরিক বাছাই করে (এই গ্রুপগুলির প্রত্যেকটির 1 বিকল্প)।

কেন?

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

আমি কেবল যে সিদ্ধান্ত নিতে পারি:

  • এটি অপটিমাইজারের অনুসন্ধান অ্যালগরিদমের একটি বাগ (বা সম্ভবত আরও সীমাবদ্ধতা)
    • সূচকগুলি পরিবর্তন করে এবং কেবল 5 টিতে যুক্ত হয়ে দ্বিতীয় ক্যোয়ারির জন্য বাছাই সরিয়ে দেয় (6, 7, এবং 8 কীগুলির মধ্যে সারণি রয়েছে)।
    • এর থেকে বোঝা যায় যে 8 টি কী সহ অনুসন্ধানের স্থানটি এত বড় যে অপটিমাইজারের কাছে "ভাল পর্যাপ্ত পরিকল্পনা পাওয়া গেছে" কারণটির সাথে তাড়াতাড়ি শেষ হওয়ার আগে অ-বাছাই করা সমাধানটিকে একটি কার্যকরযোগ্য বিকল্প হিসাবে সনাক্ত করার সময় নেই doesn't
    • এটি আমার কাছে সামান্য বগী বলে মনে হচ্ছে যে যোগদানের শর্তগুলির ক্রমটি অপ্টিমাইজারের অনুসন্ধানের প্রক্রিয়াটিকে এত বেশি প্রভাবিত করে, তবে সত্যই এটি আমার মাথা থেকে একটু বেশি
  • ফলাফলের নির্ভুলতা নিশ্চিত করার জন্য বাছাই করা প্রয়োজন
    • যেহেতু ক্যোয়ারী এই এক, সম্ভবনা করতে যখন কম কি হয় সাজানোর ছাড়াই চালানো, বা কী একটি ভিন্ন অনুক্রমে উল্লিখিত

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


1
আমি বিশ্বাস করি যে অনুসন্ধানের স্থান সম্পর্কে আপনার মন্তব্যটি আসলে এখানেই। কেবলমাত্র সূচকগুলি ব্যবহার করতে, অপ্টিমাইজারকে শর্তগুলির জন্য যথেষ্ট কিনা তা যাচাই করতে হবে, অতীত 5 টি কীগুলি পিছনে পড়ার আগে এটি পরীক্ষা করার জন্য অনেকগুলি সম্ভাবনা রয়েছে। আমি কৌতূহলী হয়ে
উঠছি

এবং হ্যাঁ এই অসঙ্গতিটি কিছুটা বগি বলে মনে হচ্ছে তবে এটি সূচকগুলি যাচাই করতে ব্যবহৃত অ্যালগরিদমের উপর সম্পূর্ণ নির্ভরশীল sufficient যদি সমস্ত সংমিশ্রণ পরীক্ষা করা হয় তবে আপনি সম্ভবত ফলাফলগুলিতে প্যাটার্নটি দেখতে সক্ষম হবেন এবং কোন অ্যালগরিদম ব্যবহার করা হয়েছে তা নির্ধারণ করতে পারবেন। আমি বাজি ধরতাম এটি আরও সাধারণ ব্যবহারের ক্ষেত্রে অনুকূলভাবে সম্পাদন করার জন্য লেখা হয়েছে। একটি বিকল্প উপস্থিত থাকতে পারে যা সময়সীমার মধ্যে 8 কী সমাধানটি নির্ভরযোগ্যতার সাথে খুঁজে পেতে সক্ষম হয়, তবে 3-4 টি কী বলার চেয়ে কম থাকলে এটি বর্তমান সমাধানের চেয়ে ধীর হয়।
মিঃমিন্দর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.