मेरे पास प्रश्नों का एक वर्ग है जो दो चीजों में से एक के अस्तित्व के लिए परीक्षण करता है। यह रूप का है
SELECT CASE
WHEN EXISTS (SELECT 1 FROM ...)
OR EXISTS (SELECT 1 FROM ...)
THEN 1 ELSE 0 END;
वास्तविक विवरण C में उत्पन्न होता है और ODBC कनेक्शन पर एक तदर्थ क्वेरी के रूप में निष्पादित होता है।
यह हाल ही में प्रकाश में आया है कि दूसरा सेलेक्ट शायद ज्यादातर मामलों में पहले सेलेक्ट की तुलना में तेज होगा और दो एक्जिट क्लॉस के ऑर्डर को स्विच करने से कम से कम एक अपमानजनक टेस्ट केस में तेज गति आई जिससे हम अभी बने थे।
करने के लिए स्पष्ट बात यह है कि आगे बढ़ें और दो खंडों को स्विच करें, लेकिन मैं यह देखना चाहता था कि क्या एसक्यूएल सर्वर से अधिक परिचित इस पर वजन करने के लिए परवाह करेंगे। ऐसा लगता है कि मैं संयोग और "कार्यान्वयन विवरण" पर भरोसा कर रहा हूं।
(ऐसा भी लगता है कि यदि SQL सर्वर होशियार था, तो यह समानांतर में दोनों उदाहरणों को निष्पादित करेगा और जो भी एक पहले शॉर्ट-सर्किट दूसरे को पूरा करेगा।)
क्या ऐसी क्वेरी के चलने के समय में सुधार के लिए SQL सर्वर प्राप्त करने का एक बेहतर तरीका है?
अपडेट करें
मेरे प्रश्न में आपके समय और रुचि के लिए धन्यवाद। मैं वास्तविक क्वेरी योजनाओं के बारे में प्रश्नों की उम्मीद नहीं कर रहा था, लेकिन मैं उन्हें साझा करने के लिए तैयार हूं।
यह SQL Server 2008R2 और अधिक से अधिक का समर्थन करने वाले सॉफ़्टवेयर घटक के लिए है। कॉन्फ़िगरेशन और उपयोग के आधार पर डेटा का आकार काफी भिन्न हो सकता है। मेरे सहकर्मी ने क्वेरी में यह बदलाव करने के बारे में सोचा क्योंकि (उदाहरण में) dbf_1162761$z$rv$1257927703तालिका में dbf_1162761$z$dd$1257927703तालिका की तुलना में इसमें पंक्तियों की संख्या हमेशा अधिक या बराबर होगी - कभी-कभी बहुत अधिक (परिमाण के आदेश)।
यहाँ मेरे द्वारा उल्लिखित अपमानजनक मामला है। पहली क्वेरी सबसे धीमी है और इसमें लगभग 20 सेकंड लगते हैं। दूसरी क्वेरी एक पल में पूरी होती है।
इसके लायक क्या है, "OPTIMIZE FOR UNKNOWN" बिट को भी हाल ही में जोड़ा गया था क्योंकि पैरामीटर सूँघना कुछ मामलों को ट्रैश कर रहा था।
मूल प्रश्न:
SELECT CASE
WHEN EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$rv$1257927703 rv INNER JOIN zumero.dbf_1162761$t$tx tx ON tx.txid=rv.txid WHERE tx.generation BETWEEN 1500 AND 2502)
OR EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$dd$1257927703 dd INNER JOIN zumero.dbf_1162761$t$tx tx ON tx.txid=dd.txid WHERE tx.generation BETWEEN 1500 AND 2502)
THEN 1 ELSE 0 END
OPTION (OPTIMIZE FOR UNKNOWN)
मूल योजना:
|--Compute Scalar(DEFINE:([Expr1006]=CASE WHEN [Expr1007] THEN (1) ELSE (0) END))
|--Nested Loops(Left Semi Join, DEFINE:([Expr1007] = [PROBE VALUE]))
|--Constant Scan
|--Concatenation
|--Nested Loops(Inner Join, WHERE:([scale].[zumero].[dbf_1162761$z$rv$1257927703].[txid] as [rv].[txid]=[scale].[zumero].[dbf_1162761$t$tx].[txid] as [tx].[txid]))
| |--Clustered Index Scan(OBJECT:([scale].[zumero].[dbf_1162761$z$rv$1257927703].[PK__dbf_1162__97770A2F62EEAE79] AS [rv]), WHERE:([scale].[zumero].[dbf_1162761$z$rv$1257927703].[txid] as [rv].[txid]>(0)))
| |--Index Seek(OBJECT:([scale].[zumero].[dbf_1162761$t$tx].[gendex] AS [tx]), SEEK:([tx].[generation] >= (1500) AND [tx].[generation] <= (2502)) ORDERED FORWARD)
|--Nested Loops(Inner Join, OUTER REFERENCES:([tx].[txid]))
|--Clustered Index Scan(OBJECT:([scale].[zumero].[dbf_1162761$t$tx].[PK__dbf_1162__E3BA953EC2197789] AS [tx]), WHERE:([scale].[zumero].[dbf_1162761$t$tx].[generation] as [tx].[generation]>=(1500) AND [scale].[zumero].[dbf_1162761$t$tx].[generation] as [tx].[generation]<=(2502)) ORDERED FORWARD)
|--Index Seek(OBJECT:([scale].[zumero].[dbf_1162761$z$dd$1257927703].[n$dbf_1162761$z$dd$txid$1257927703] AS [dd]), SEEK:([dd].[txid]=[scale].[zumero].[dbf_1162761$t$tx].[txid] as [tx].[txid]), WHERE:([scale].[zumero].[dbf_1162761$z$dd$1257927703].[txid] as [dd].[txid]>(0)) ORDERED FORWARD)
निश्चित क्वेरी:
SELECT CASE
WHEN EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$dd$1257927703 dd INNER JOIN zumero.dbf_1162761$t$tx tx ON tx.txid=dd.txid WHERE tx.generation BETWEEN 1500 AND 2502)
OR EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$rv$1257927703 rv INNER JOIN zumero.dbf_1162761$t$tx tx ON tx.txid=rv.txid WHERE tx.generation BETWEEN 1500 AND 2502)
THEN 1 ELSE 0 END
OPTION (OPTIMIZE FOR UNKNOWN)
निश्चित योजना:
|--Compute Scalar(DEFINE:([Expr1006]=CASE WHEN [Expr1007] THEN (1) ELSE (0) END))
|--Nested Loops(Left Semi Join, DEFINE:([Expr1007] = [PROBE VALUE]))
|--Constant Scan
|--Concatenation
|--Nested Loops(Inner Join, OUTER REFERENCES:([tx].[txid]))
| |--Clustered Index Scan(OBJECT:([scale].[zumero].[dbf_1162761$t$tx].[PK__dbf_1162__E3BA953EC2197789] AS [tx]), WHERE:([scale].[zumero].[dbf_1162761$t$tx].[generation] as [tx].[generation]>=(1500) AND [scale].[zumero].[dbf_1162761$t$tx].[generation] as [tx].[generation]<=(2502)) ORDERED FORWARD)
| |--Index Seek(OBJECT:([scale].[zumero].[dbf_1162761$z$dd$1257927703].[n$dbf_1162761$z$dd$txid$1257927703] AS [dd]), SEEK:([dd].[txid]=[scale].[zumero].[dbf_1162761$t$tx].[txid] as [tx].[txid]), WHERE:([scale].[zumero].[dbf_1162761$z$dd$1257927703].[txid] as [dd].[txid]>(0)) ORDERED FORWARD)
|--Nested Loops(Inner Join, WHERE:([scale].[zumero].[dbf_1162761$z$rv$1257927703].[txid] as [rv].[txid]=[scale].[zumero].[dbf_1162761$t$tx].[txid] as [tx].[txid]))
|--Clustered Index Scan(OBJECT:([scale].[zumero].[dbf_1162761$z$rv$1257927703].[PK__dbf_1162__97770A2F62EEAE79] AS [rv]), WHERE:([scale].[zumero].[dbf_1162761$z$rv$1257927703].[txid] as [rv].[txid]>(0)))
|--Index Seek(OBJECT:([scale].[zumero].[dbf_1162761$t$tx].[gendex] AS [tx]), SEEK:([tx].[generation] >= (1500) AND [tx].[generation] <= (2502)) ORDERED FORWARD)

