2009-06-15 7 views
7

मैं दो तालिकाओं है:क्या टी-एसक्यूएल में फ़िल्टरिंग या जुड़ना पहले होता है?

Customers(Id, Name, TownId) T 
Towns(Id, Name) 

मैं इस तरह एक एसक्यूएल बयान है:

SELECT * 
FROM Customers 
INNER JOIN Towns ON Towns.Id = Customers.TownId 
WHERE Customers.Id > 5 

क्या पहले होगा?
क्या यह Customers तालिका फ़िल्टर करेगा और फिर चयनित रिकॉर्ड में Towns तालिका के साथ शामिल होगा?
क्या यह CustomersTowns के साथ जुड़ जाएगा और फिर फ़िल्टर करेगा? या यह है कि आप नहीं बता सकते हैं?

उत्तर

15

अनुकूलक जो भी सोचता है वह करेगा जो सबसे तेज़ होगा।

आप कुछ व्यवहारों को संकेतों में शामिल होने या आंकड़ों और अनुक्रमों के साथ कुछ व्यवहारों को प्रोत्साहित करने के लिए मजबूर कर सकते हैं। हालांकि, ऑप्टिमाइज़र पर भरोसा करना आमतौर पर सबसे अच्छा होता है।

यदि आप एक क्वेरी निष्पादित करने के बारे में विस्तृत स्पष्टीकरण चाहते हैं, तो execution plan देखें।

+3

किसी विशेष क्यूईपी को "बल" करने की सामान्य तकनीक लगभग सभी विक्रेता निर्भर हैं ... विक्रेता-लॉक-इन को प्रभावी ढंग से प्राप्त कर रहे हैं। उस कुल्हाड़ी यूजीन के साथ सावधान। गुलाबी फ्लॉइड के लिए – corlettk

+0

+1। :-) – GuyBehindtheGuy

0

लेमन शब्दों में, फ़िल्टर शामिल होने से पहले होगा, इसलिए आप फ़िल्टरिंग से पहले दोनों टेबलों की पूरी तरह से शामिल नहीं होंगे।

आपके द्वारा उपयोग किए जाने वाले टूलसेट के आधार पर, आपको क्वेरी की निष्पादन योजना दिखाने के लिए एक विकल्प मिलना चाहिए, जो निष्पादन के आदेश और प्रत्येक चरण की लागत को देखने में आपकी सहायता करेगा।

1

आम तौर पर बोलते हुए, पहले शामिल होता है। पर विचार करें:

 
t1.id t1.foo  t2.id t2.bar t2.t1_id 
-------------  ------------------------ 
    1 'abc'   1 '123'   1 
    2 'def'   2 '456'   1 
    3 'ghi'   3 '789'   2 
    4 'jkl'   4 '0'  NULL 

इस क्वेरी:

SELECT 
    t1.foo, 
    t2.bar 
FROM 
    t1 
    LEFT JOIN t2 ON t1.id = t2.t1_id 
WHERE 
    t2.somevalue IS NOT NULL 

निकलेगा:

 
foo  bar 
------------- 
'abc' '123' 
'abc' '456' 
'def' '789' 

जबकि, जब आप शर्त में शामिल होने में फिल्टर खींच, छानने के साथ-साथ शामिल होने से होता है:

SELECT 
    t1.foo, 
    t2.bar 
FROM 
    t1 
    LEFT JOIN t2 ON t1.id = t2.t1_id AND t2.somevalue IS NOT NULL 

उपज:

 
foo  bar 
------------- 
'abc' '123' 
'abc' '456' 
'def' '789' 
'ghi' NULL 
'jkl' NULL 

अधिक जटिल क्वेरी हो जाता है, कम आसान यह कहना जो अभिलेख के बाद कार्य योजना लागू करने से पहले टेबल शामिल हो गए हैं, और जो द्वारा फ़िल्टर कर रहे हैं।

+0

यह मेरे प्रश्न का बिल्कुल सही जवाब नहीं है .. मेरे उदाहरण में, क्या आप गारंटी दे सकते हैं कि शामिल होने से पहले हमेशा पहले होगा? – agnieszka

+0

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

+0

यह परिणाम में कोई फर्क नहीं पड़ता है, लेकिन यह दक्षता में अंतर बनाता है।वैसे भी, इससे कोई फर्क नहीं पड़ता, मैं सिर्फ यह जानना चाहता हूं कि पहले क्या होता है, भले ही लौटाए गए परिणाम समान हों – agnieszka

0

जब क्वेरी को मर्ज में शामिल होने के रूप में प्रयोग किया जाता है, फ़िल्टरिंग और जुड़ना एक साथ होता है।

संबंधित मुद्दे