2015-06-10 15 views
5

कौन सा क्लॉज SELECT कथन में पहले प्रदर्शन करता है?जो पहले WHERE क्लॉज या जॉइन क्लॉज

मुझे इस आधार पर select क्वेरी में कोई संदेह है।

नीचे दिए गए उदाहरण

SELECT * 
FROM #temp A 
INNER JOIN #temp B ON A.id = B.id 
INNER JOIN #temp C ON B.id = C.id 
WHERE A.Name = 'Acb' AND B.Name = C.Name 
  1. पर विचार हैं, पहले यह WHERE खंड की जाँच करता है और उसके बाद INNER JOIN

  2. पहले JOIN करता है और फिर हालत की जाँच करता है?

यह पहली JOIN और फिर WHERE हालत प्रदर्शन करता है तो; यह अलग-अलग JOIN एस के लिए स्थितियों को और अधिक कैसे कर सकता है?

+1

शायद यह मदद मिलेगी: http://stackoverflow.com/प्रश्न/8798 9 ​​3/एसक्यूएल-ऑर्डर-ऑफ-ऑपरेशंस –

+2

संचालन के लिए एक * तार्किक * प्रसंस्करण आदेश है लेकिन डेटाबेस सिस्टम उन परिचालनों को फिर से व्यवस्थित करने के लिए स्वतंत्र हैं बशर्ते उत्पादित अंतिम परिणाम समान हैं जैसे कि उन्होंने तार्किक प्रसंस्करण का पालन किया है आदेश। आपको वास्तविक आदेश की परवाह नहीं करनी चाहिए, जब तक कि यह बुरी तरह से प्रदर्शन न करे - आपको "आप क्या चाहते हैं" सर्वर को बताना चाहिए, "इसे कैसे करें" –

+0

इससे मदद मिलेगी: http://stackoverflow.com/questions/19477950/ हैं-भीतरी में शामिल होने और बाहरी-जोड़-आवश्यक/19478161 # 19478161 – Deepshikha

उत्तर

6

क्वेरी प्रोसेसिंग के वैचारिक आदेश है:

1. FROM 
2. WHERE 
3. GROUP BY 
4. HAVING 
5. SELECT 
6. ORDER BY 

लेकिन यह सिर्फ एक वैचारिक आदेश है। वास्तव में इंजन क्लॉज को पुनर्व्यवस्थित करने का निर्णय ले सकता है। यहां सबूत है।1000000 पंक्तियों से प्रत्येक के साथ 2 टेबल बनाने की सुविधा देता है:

SELECT * FROM dbo.test1 t1 
JOIN dbo.test2 t2 ON t2.id = t1.id AND t2.id = 100 
WHERE t1.id > 1 


SELECT * FROM dbo.test1 t1 
JOIN dbo.test2 t2 ON t2.id = t1.id 
WHERE t1.id = 1 

सूचना पहले सबसे पंक्तियां फिल्टर होगा join हालत में बाहर, दूसरा where हालत में:

CREATE TABLE test1 (id INT IDENTITY(1, 1), name VARCHAR(10)) 
CREATE TABLE test2 (id INT IDENTITY(1, 1), name VARCHAR(10)) 


;WITH cte AS(SELECT -1 + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) d FROM 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t3(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t4(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t5(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t6(n)) 

INSERT INTO test1(name) SELECT 'a' FROM cte 

अब 2 क्वेरी चला। उत्पादन की योजना को देखो:

1 TableScan - विधेय:।।।। [टेस्ट] [dbo] [test2] इसे [t2] [id] = (100) [id]

2 TableScan - विधेय:।।।। [टेस्ट] [dbo] [test2] [id] के रूप में [t2] [id] = (1)

जिसका मतलब है कि पहली क्वेरी अनुकूलित में फिल्टर करने के लिए join स्थिति का मूल्यांकन करने के लिए पहले का फैसला किया बाहर पंक्तियों, दूसरे में यह where पहले खंड का मूल्यांकन किया।

2

आप MSDN

एक प्रश्न द्वारा चयनित पंक्तियों का उल्लेख कर सकते खंड से से पहले फ़िल्टर्ड रहे हैं की स्थिति है, तो कहां खंड खोज की स्थिति में शामिल होने, और फिर HAVING क्लॉज़ खोज की स्थिति। आंतरिक जोड़ों को अंतिम परिणाम को प्रभावित किए बिना या तो FROM या WHERE खंड में निर्दिष्ट किया जा सकता है।

तुम भी आपकी क्वेरी को निष्पादित आपकी क्वेरी के निष्पादन योजना को दिखाने के लिए इतना है कि आप दो में प्रदर्शन अंतर को मापने कर सकते हैं इससे पहले कि SET SHOWPLAN_ALL ON उपयोग कर सकते हैं।

4

क्वेरी प्रोसेसिंग चरणों के तार्किक क्रम है:

  1. FROM - सहित JOIN रों
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

तुम भी अपने JOIN या WHERE खंड पर शर्तों के रूप में के रूप में कई हो सकते हैं। जैसा:

Select * from #temp A 
INNER JOIN #temp B ON A.id = B.id AND .... AND ... 
INNER JOIN #temp C ON B.id = C.id AND .... AND ... 
Where A.Name = 'Acb' 
AND B.Name = C.Name 
AND .... 
1

आप इस join optimization

SELECT * FROM T1 INNER JOIN T2 ON P1(T1,T2) 
       INNER JOIN T3 ON P2(T2,T3) 
    WHERE P(T1,T2,T3) 

नेस्टेड लूप का उल्लेख कर सकते एल्गोरिथ्म में शामिल होने के निम्नलिखित तरीके से इस क्वेरी निष्पादित होगा:

FOR each row t1 in T1 { 
    FOR each row t2 in T2 such that P1(t1,t2) { 
    FOR each row t3 in T3 such that P2(t2,t3) { 
     IF P(t1,t2,t3) { 
     t:=t1||t2||t3; OUTPUT t; 
     } 
    } 
    } 
} 
संबंधित मुद्दे