SQL সার্ভার 2012 (11.0.6020) একটি বোঝা যাচ্ছে যে নেতারা বরং সহজ পরীক্ষা বিছানা নির্মাণের আমাকে দুই হ্যাশ মিলেছে প্রশ্নের একটি মাধ্যমে ঘনিভূত হচ্ছে একটি পরিকল্পনা পুনঃ করার অনুমতি দেয় UNION ALL
। আমার পরীক্ষা-শয্যা আপনি যে ভুল অনুমানটি দেখেন তা প্রদর্শন করে না। সম্ভবত এটি একটি এসকিউএল সার্ভার 2014 সিই সমস্যা।
আমি একটি ক্যোয়ারির জন্য 133.785 সারিগুলির একটি অনুমান পাই যা আসলে ২৮০ টি সারি দেয়, তবে আশা করা যায় যে আমরা আরও নীচে দেখব:
IF OBJECT_ID('dbo.Union1') IS NOT NULL
DROP TABLE dbo.Union1;
CREATE TABLE dbo.Union1
(
Union1_ID INT NOT NULL
CONSTRAINT PK_Union1
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, Union1_Text VARCHAR(255) NOT NULL
, Union1_ObjectID INT NOT NULL
);
IF OBJECT_ID('dbo.Union2') IS NOT NULL
DROP TABLE dbo.Union2;
CREATE TABLE dbo.Union2
(
Union2_ID INT NOT NULL
CONSTRAINT PK_Union2
PRIMARY KEY CLUSTERED
IDENTITY(2,2)
, Union2_Text VARCHAR(255) NOT NULL
, Union2_ObjectID INT NOT NULL
);
INSERT INTO dbo.Union1 (Union1_Text, Union1_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;
INSERT INTO dbo.Union2 (Union2_Text, Union2_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;
GO
SELECT *
FROM dbo.Union1 u1
INNER HASH JOIN sys.objects o ON u1.Union1_ObjectID = o.object_id
UNION ALL
SELECT *
FROM dbo.Union2 u2
INNER HASH JOIN sys.objects o ON u2.Union2_ObjectID = o.object_id;
আমি মনে করি কারণটি ইউএনইএনআইড হওয়া দুটি ফলাফলের সাথে যোগ দেয় তার পরিসংখ্যানের অভাবের কাছাকাছি। এসকিউএল সার্ভারকে পরিসংখ্যানের অভাবের মুখোমুখি হওয়ার সময় কলামগুলির নির্বাচনের চারপাশে বেশিরভাগ ক্ষেত্রে শিক্ষিত অনুমান করা দরকার।
জো স্যাক এখানে একটি আকর্ষণীয় পড়া আছে ।
একটির জন্য UNION ALL
, এটি বলা নিরাপদ যে আমরা ইউনিয়নের প্রতিটি উপাদান দ্বারা ফিরে আসা সারির মোট সংখ্যাটি দেখতে পাব, তবে এসকিউএল সার্ভার যেহেতু দুটি উপাদানগুলির জন্য সারি অনুমান ব্যবহার করছে UNION ALL
, আমরা দেখতে পাচ্ছি এটি উভয় থেকে মোট আনুমানিক সারি যুক্ত করেছে কনটেস্টেশন অপারেটরের জন্য অনুমানের সাথে প্রশ্নগুলি আসে।
উপরের আমার উদাহরণে, প্রতিটি অংশের জন্য সারিগুলির আনুমানিক সংখ্যা UNION ALL
.8 66.৮৯27।, যা যখন যোগফল হয় ১৩৩.8585৫ সমান, যা আমরা কনকনেটেশন অপারেটরের জন্য সারিগুলির আনুমানিক সংখ্যার জন্য দেখতে পাই।
উপরের ইউনিয়ন ক্যোয়ারির জন্য প্রকৃত বাস্তবায়ন পরিকল্পনাটি দেখে মনে হচ্ছে:
আপনি "আনুমানিক" বনাম "আসল" সারিগুলির সংখ্যা দেখতে পারেন। আমার ক্ষেত্রে, দুটি হ্যাশ ম্যাচ অপারেটরদের দ্বারা ফিরে আসা "আনুমানিক" সারি সংযুক্ত করা কনকন্টেশন অপারেটরের দেখানো পরিমাণের সমান।
পল হোয়াইটের পোস্টে আপনি যেভাবে আপনার প্রশ্নের বিবরণ দেখিয়েছেন সে অনুযায়ী আমি 23৩৩ টি ট্রেস থেকে আউটপুট নেওয়ার চেষ্টা করব। অথবা, আপনি ব্যবহার করার চেষ্টা করুন পারে OPTION (QUERYTRACEON 9481)
ক্যোয়ারী করা ফিরে সংস্করণ 70 সিই প্রত্যাবর্তন যদি যে "সংশোধন করা হয়েছে" বিষয়টি দেখতে।