मेरे पास दो टेबल हैं, जिनका नाम पहचाना गया है, टाइप किया गया है, और इंडेक्स किए गए प्रमुख कॉलम हैं। उनमें से एक के पास एक अद्वितीय क्लस्टर इंडेक्स है, दूसरे में एक गैर-अद्वितीय है ।
परीक्षण सेटअप
सेटअप स्क्रिप्ट, कुछ यथार्थवादी आँकड़े सहित:
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 के SP2 एंटरप्राइज़ पर खोजा, 2017 डेवलपर (वर्तमान CU) पर एक रिप्रो बनाया।
- प्रमुख सूचकांक कॉलम पर WHERE क्लॉज हटाने से अच्छी योजना बनती है, लेकिन यह परिणामों को प्रभावित करती है .. :)
अंत में, हम प्रश्न पर पहुँचते हैं
- क्या यह जानबूझकर है?
- क्या मैं क्वेरी को बदले बिना (जो कि वेंडर कोड है, को समाप्त कर सकता हूं, इसलिए मैं वास्तव में नहीं बल्कि ...)। मैं टेबल और इंडेक्स बदल सकता हूं।