2013-01-08 11 views
10

मेरे पास एक प्रश्न है जिसमें मैं 13 बाएं बाहरी जॉइन का उपयोग कर रहा हूं। बहुत बाएं तालिका में एक बड़ा डेटा है, इसलिए क्वेरी निष्पादित करने और परिणाम वापस करने में बहुत अधिक समय लगता है। लेकिन जब मैं परिणाम फ़िल्टर करने के लिए एक खंड का उपयोग कर रहा हूं, तो इसमें बहुत कम समय लगता है। अब मैं उलझन में हूं कि किसके बारे में पहले निष्पादित होता है: जो परिणाम परिणाम उत्पन्न करता है और फिर जहां से क्लॉज फ़िल्टर होता है या पहले यह परिणाम को फ़िल्टर करता है परिणामस्वरूप शामिल होता है।जो पहले चलता है: जुड़ता है या कहां

+3

ध्यान रखें कि कैसे SQL सर्वर की क्वेरी अनुकूलक के चारों ओर अपने चरणों शफ़ल करने के लिए चुनता की परवाह किए बिना, सबसे अच्छी बात आप कर सकते हैं ठीक से बनाए रखने और सूचकांक अपने डेटा है तो सर्वर और अधिक आसानी से अपना काम करते आ सकता है। –

+1

अच्छी तरह से बनाए रखा 'सांख्यिकी' भी मदद करते हैं। – MarkD

+0

अपनाने के लिए मत भूलना और इसे स्वीकार करने के रूप में चिह्नित करें अगर आपको वह जानकारी मिलती है जो आपको wnat –

उत्तर

10

आम तौर पर, कोई भी डीबीएमएस (जैसे कि एसक्यूएल) अपना स्वयं का क्वेरी ऑप्टिमाइज़ेशन करेगा, जो एल्गोरिदम का उपयोग करता है जो यह सबसे तेज़ है। तो यह फ़िल्टरिंग है, फिर शामिल हो रहा है।

2

पढ़ें: which one runs first in query execution WHERE CLAUSE orJOIN CLAUSE ?

और

मैं पिनाल डेव के पद Reding रहा हूँ और मैं इस पाया, यह मदद talso migh आप को समझने के लिए

SQL SERVER – Interesting Observation of ON Clause on LEFT JOIN – How ON Clause affects Resultset in LEFT JOIN

enter image description here

enter image description here

उस खंड पर समझें जो जॉइन से पहले लागू होता है, यही कारण है कि यह तालिका 2 के सभी परिणाम पुनर्प्राप्त करता है जहां फ्लैग = 1 है लेकिन यह तालिका 1 को प्रभावित नहीं करता है, इसलिए यह तालिका 1 की सभी पंक्तियों को पुनर्प्राप्त करता है। जब WHERE क्लॉज लागू होता है तो यह पूर्ण परिणाम पर लागू होता है, इसलिए यह तालिका 1 और तालिका 2 से सभी पंक्तियों को हटा देता है जहां ध्वज 1 के बराबर नहीं है, अनिवार्य रूप से तालिका 1 और तालिका 2 से ध्वज = 1 पंक्तियों को रखना।

2

Copied from my previous answer

create table A(id int); 
create table B(id int); 

INSERT INTO A VALUES(1); 
INSERT INTO A VALUES(2); 
INSERT INTO A VALUES(3); 

INSERT INTO B VALUES(1); 
INSERT INTO B VALUES(2); 
INSERT INTO B VALUES(3); 

SELECT * FROM A; 
SELECT * FROM B; 

id 
----------- 
1 
2 
3 

id 
----------- 
1 
2 
3 

फ़िल्टर पर शामिल हों प्रक्रिया के दौरान शामिल होने से रोकने के लिए पंक्तियों में शामिल हों।

select a.*,b.* 
from A a left join B b 
on  a.id =b.id and a.id=2; 

id   id 
----------- ----------- 
1   NULL 
2   2 
3   NULL 

जॉइन होने के बाद फ़िल्टर किया जाएगा।

select a.*,b.* 
from A a left join B b 
on  a.id =b.id 
where a.id=2; 

id   id 
----------- ----------- 
2   2 
संबंधित मुद्दे