SQL सर्वर 2012 (11.0.6020) पर एक समान रूप से सरल परीक्षण बिस्तर का निर्माण मुझे दो हैश मिलान वाले प्रश्नों के साथ एक योजना को फिर से बनाने की अनुमति देता है UNION ALL
। मेरा परीक्षण-बिस्तर आपके द्वारा देखे गए गलत अनुमान को प्रदर्शित नहीं करता है। शायद यह है एक SQL सर्वर 2014 सीई समस्या।
मुझे एक क्वेरी के लिए 133.785 पंक्तियों का अनुमान है जो वास्तव में 280 पंक्तियों को लौटाता है, हालांकि उम्मीद की जानी है कि हम नीचे देखेंगे।
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;
मुझे लगता है कि यह कारण दो परिणामी जोड़ियों के लिए आंकड़ों की कमी के आसपास है जो कि यूनिअनियन हैं। SQL सर्वर को आंकड़ों की कमी का सामना करने पर कॉलम की चयनात्मकता के आसपास अधिकांश मामलों में शिक्षित अनुमान लगाने की आवश्यकता होती है।
जो सैक ने यहां पर एक दिलचस्प पढ़ा है ।
ए के लिए UNION ALL
, यह कहना सुरक्षित है कि हम संघ के प्रत्येक घटक द्वारा लौटी पंक्तियों की कुल संख्या देखेंगे, हालाँकि चूंकि SQL सर्वर दो घटकों के लिए पंक्ति अनुमान का उपयोग कर रहा है UNION ALL
, हम देखते हैं कि यह दोनों से कुल अनुमानित पंक्तियों को जोड़ता है सहमति ऑपरेटर के लिए अनुमान के साथ आने के लिए प्रश्न।
उपरोक्त मेरे उदाहरण में, प्रत्येक भाग के लिए पंक्तियों की अनुमानित संख्या UNION ALL
६६. the ९ २med है, जो कि जब १३३. we see५ के बराबर होती है, जिसे हम संघचालक के लिए पंक्तियों की अनुमानित संख्या के लिए देखते हैं।
यूनियन क्वेरी के लिए वास्तविक निष्पादन योजना इस प्रकार है:
आप पंक्तियों की "अनुमानित" बनाम "वास्तविक" संख्या देख सकते हैं। मेरे मामले में, दो हैश मैच ऑपरेटरों द्वारा लौटाई गई पंक्तियों की "अनुमानित" संख्या को जोड़ना परिचालनात्मक ऑपरेटर द्वारा दिखाई गई राशि के बराबर है।
मैं 2363 से ट्रेस से आउटपुट प्राप्त करने की कोशिश करूंगा, जैसा कि पॉल व्हाइट की पोस्ट में सुझाया गया है जो आप अपने प्रश्न में दिखा रहे हैं। वैकल्पिक रूप से, आप इस समस्या को "ठीक" करने के लिए यह देखने के लिए कि संस्करण 70 CE में वापस लौटने केOPTION (QUERYTRACEON 9481)
लिए क्वेरी का उपयोग करने का प्रयास कर सकते हैं ।