কেন সমান্তরালতা (পুনরায় বিভাগের স্ট্রিম) অপারেটর সারি অনুমানকে হ্রাস করবে 1?


12

আমি এসকিউএল সার্ভার 2012 এন্টারপ্রাইজ ব্যবহার করছি। আমি একটি এসকিউএল পরিকল্পনা পেয়েছি যা এমন কিছু আচরণের প্রদর্শন করছে যা আমি সম্পূর্ণ স্বজ্ঞাত নয়। ভারী সমান্তরাল সূচক স্ক্যান অপারেশনের পরে, একটি সমান্তরালতা (পুনরায় বিভাগের স্ট্রিমস) অপারেশন ঘটে, তবে এটি সূচি স্ক্যান (অবজেক্ট 10.আইডেক্স 2) দ্বারা ফিরে আসা সারি অনুমানকে মেরে ফেলছে, অনুমানটি হ্রাস করে ১. আমি কিছু অনুসন্ধান করেছি, তবে এই আচরণের ব্যাখ্যা দেয় এমন কোনও কিছু জুড়ে আসেনি। কোয়েরিটি বেশ সহজ, যদিও প্রতিটি টেবিলটিতে কম লক্ষ লক্ষ লোকের রেকর্ড রয়েছে। এটি একটি ডিডাব্লুএইচ লোড প্রক্রিয়াটির অংশ এবং এই মধ্যবর্তী ডেটা সেটটি কয়েকবার ছোঁয়া হয়েছে তবে আমার কাছে থাকা প্রশ্নটি বিশেষত সারি অনুমানের সাথে সম্পর্কিত। কেউ কী ব্যাখ্যা করতে পারে যে সমান্তরালতা (পুনরায় ভাগের শক্তি) অপারেটরের মধ্যে সঠিক সারির অনুমান 1 এ কেন যায়? এছাড়াও,

প্ল্যানটি পেস্ট করার জন্য আমি সম্পূর্ণ পরিকল্পনা পোস্ট করেছি ।

প্রশ্নবিদ্ধ অপারেশন এখানে:

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

পরিকল্পনার গাছ সহ আরও যে প্রসঙ্গে যুক্ত হয়:

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

আমি কি পল হোয়াইট দায়ের করা এই সংযোগ আইটেমটির কিছুটা প্রকরণের দিকে যেতে পারি (তার ব্লগে এখানে আরও গভীরতর বিবরণ )? কমপক্ষে এটিই আমি খুঁজে পেয়েছি যা খেলায় শীর্ষস্থানীয় কোনও অপারেটর না থাকলেও আমি যা যা চালাচ্ছি তার কাছাকাছি থেকে খুব কাছাকাছি মনে হয়েছে।

উত্তর:


9

বিটম্যাপ ফিল্টার সহ ক্যোয়ারী প্ল্যানগুলি কখনও কখনও পড়ার পক্ষে জটিল হয়ে উঠতে পারে। বিভাজন প্রবাহের জন্য বিওএল নিবন্ধ থেকে (জোর দেওয়া খনি):

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

উপরন্তু, একটি নিবন্ধ বিটম্যাপ ফিল্টার এছাড়াও সহায়ক হল:

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

আমি বিশ্বাস করি আপনি এটি নিজের ক্যোয়ারী দিয়ে পর্যবেক্ষণ করছেন। বিটম্যাপ অপারেটরটি IN_ROWফ্যাক্ট টেবিলের বিপরীতে থাকা সত্ত্বেও কোনও কার্ডিনালিটি প্রাক্কলন হ্রাস করে পুনরায় বিভাগ স্ট্রিম অপারেটরকে দেখানোর জন্য তুলনামূলক সহজ ডেমো নিয়ে আসা সম্ভব । ডেটা প্রস্তুতি:

create table outer_tbl (ID BIGINT NOT NULL);

INSERT INTO outer_tbl WITH (TABLOCK)
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values;

create table inner_tbl_1 (ID BIGINT NULL);
create table inner_tbl_2 (ID BIGINT NULL);

INSERT INTO inner_tbl_1 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

INSERT INTO inner_tbl_2 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

এখানে একটি ক্যোয়ারী যা আপনার চালানো উচিত নয়:

SELECT *
FROM outer_tbl o
INNER JOIN inner_tbl_1 i ON o.ID = i.ID
INNER JOIN inner_tbl_2 i2 ON o.ID = i2.ID
OPTION (HASH JOIN, QUERYTRACEON 9481, QUERYTRACEON 8649);

আমি পরিকল্পনা আপলোড করেছি । অপারেটরের কাছে একবার দেখুন inner_tbl_2:

পুনরায় বিভাজন সারি হারিয়েছে

আপনি পল হোয়াইটের সাহায্যে নলযোগ্য কলামগুলিতে হ্যাশ যোগদানের দ্বিতীয় পরীক্ষাটিও পেতে পারেন ।

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

সারি ডিস্ট্রো

এর ভিত্তিতে আমি সন্দেহ করি যে Object1.Column21কলামটির জন্য আপনার অনেকগুলি পুনরাবৃত্তি মান রয়েছে । যদি বারবার কলামগুলি স্ট্যাটাসের হিস্টোগ্রামে না ঘটে থাকে Object4.Column19তবে এসকিউএল সার্ভার কার্ডিনালিটির অনুমানটি খুব ভুল পেতে পারে।

আমি মনে করি যে আপনার উদ্বিগ্ন হওয়া উচিত কারণ ক্যোয়ারের পারফরম্যান্সের উন্নতি করা সম্ভব হতে পারে। অবশ্যই, যদি ক্যোয়ারী প্রতিক্রিয়ার সময় বা এসএলএর প্রয়োজনীয়তাগুলি পূরণ করে তবে এটি আরও তদন্তের উপযুক্ত নয়। যাইহোক, আপনি যদি আরও তদন্ত করতে চান তবে কোয়েরি অপ্টিমাইজারের আরও ভাল তথ্য থাকলে এটি আরও ভাল পরিকল্পনা বেছে নিতে পারে কিনা তা সম্পর্কে ধারণা পেতে আপনি কিছু করতে পারেন (স্ট্যাটাস আপডেট করার চেয়ে অন্য কিছু) are এর মধ্যে যোগদানের আপনি ফলাফল করা হতে পারে Database1.Schema1.Object10এবং Database1.Schema1.Object11একটি টেম্প টেবিলের মধ্যে এবং যদি আপনি নেস্টেড লুপ যোগদান করে পেতে অবিরত দেখুন। আপনি সেই যোগটিকে কোনও পরিবর্তিত করতে পারেন LEFT OUTER JOINতাই ক্যোয়ারী অপ্টিমাইজার সেই পদক্ষেপে সারিগুলির সংখ্যা হ্রাস করবে না। MAXDOP 1কী হয় তা দেখতে আপনি আপনার প্রশ্নের সাথে একটি ইঙ্গিত যোগ করতে পারেন। আপনি ব্যবহার করতে পারেনTOPজোড়কে সর্বশেষে যেতে বাধ্য করার জন্য উত্সযুক্ত টেবিল সহ, অথবা আপনি কোয়েরি থেকে যোগটি মন্তব্য করতেও পারেন। আশা করি এই পরামর্শগুলি আপনাকে শুরু করার জন্য যথেষ্ট।

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


6

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

পরবর্তী ক্ষেত্রে, ফিক্স: আপনি যখন এসকিউএল সার্ভার ২০০৮ বা এসকিউএল সার্ভার ২০০৮ আর 2 বা এসকিউএল সার্ভার ২০১২-তে সংযুক্ত এবং পূর্বাভাস ধারণ করে এমন কোনও কোয়েরি চালাচ্ছেন তখন দুর্বল পারফরম্যান্স সমর্থিত ট্রেস পতাকাটি 4137 ব্যবহার করে প্রাসঙ্গিক হতে পারে You মডেলিং এক্সটেনশানগুলি সক্ষম করতে অপ্টিমাইজার সংশোধনগুলি সক্ষম করতে, এবং / অথবা 2301 ফ্ল্যাগটি 4199 সন্ধান করুন। বেনামেয় পরিকল্পনার ভিত্তিতে এটি জানা শক্ত।

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

যদি আপনি কৌতূহলী হন তবে একটি পরীক্ষামূলক সিস্টেমে, আপনি ট্রেস পতাকা 9৪৯৮ দিয়ে ক্যোরির জন্য বিটম্যাপগুলি অক্ষম করতে পারেন You আপনি অপ্টিমাইজড বিটম্যাপগুলিও অক্ষম করতে পারেন (অপ্টিমাইজার দ্বারা বিবেচিত এবং কার্ডিনালিটির অনুমানগুলি প্রভাবিত করে), পোস্ট-অপটিমাইজেশন বিটম্যাপগুলি দিয়ে তাদের প্রতিস্থাপন করে (বিবেচিত নয়) অপ্টিমাইজার দ্বারা, কার্ডিনালিটির কোনও প্রভাব নেই) ট্রেস পতাকাগুলির সংমিশ্রণে 7497 এবং 7498. কোনও উত্পাদন সিস্টেমে ব্যবহারের জন্য নথিভুক্ত বা সমর্থিত নয়, তবে তারা এমন পরিকল্পনা তৈরি করে যা অপ্টিমাইজারটি সাধারণত বিবেচনা করতে পারে, এবং তাই জোর করে চাপানো যেতে পারে পরিকল্পনা গাইড।

উপরে উল্লিখিত হিসাবে এগুলির মধ্যে প্রথমটিতে যোগদানের জন্য দরিদ্র অনুমানের মূল সমস্যাটি সমাধান করবে না, তাই আমি এটি কেবল স্বার্থের জন্যই উল্লেখ করছি।

বিটম্যাপ এবং হ্যাশ সম্পর্কিত আরও পড়ার সাথে যোগ দেয়:


0

টুইটারে আপনার প্রতিক্রিয়া। আমি সংযুক্ত এক্সএমএলটির দিকে তাকিয়ে দেখলাম ভারসাম্যহীন সমান্তরালতা। 1 টি থ্রেডে প্রায় সমস্ত আসল সারি রয়েছে তবে অন্যদের অধিকাংশই তা করে না। সেই চিৎকারে ভারসাম্যহীন সমান্তরালতা ঘটছে। অতএব, আমি কী / যোগদানের মান এবং তার সম্পর্কিত পরিসংখ্যান এবং কার্ডিনালিটিটি অনুসন্ধান করব।

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

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