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