2010-10-18 29 views
10

मेरा प्रश्न इस SQL order of operations के समान है लेकिन थोड़ा मोड़ के साथ, इसलिए मुझे लगता है कि यह पूछना उचित है।जहां ऑपरेशन का आदेश और जॉइन आदेश

मैं टेराडाटा का उपयोग कर रहा हूं। और मेरे पास 2 टेबल हैं: table1, table2

table1 में केवल id कॉलम है।
table2 निम्नलिखित स्तंभ हैं: id, val

मैं गलत हो सकता है लेकिन मुझे लगता है इन दो बयानों में एक ही परिणाम देती है।

वक्तव्य 1.

SELECT table1.id, table2.val 
FROM table1 
INNER JOIN table2 
ON table1.id = table2.id 
WHERE table2.val<100 

वक्तव्य 2.

SELECT table1.id, table3.val 
FROM table1 
INNER JOIN (
    SELECT * 
    FROM table2 
    WHERE val<100 
) table3 
ON table1.id=table3.id 

मेरे सवालों का, है क्वेरी अनुकूलक
करने के लिए पर्याप्त चतुर होगा - पर अमल कहां खंड पहले तो वक्तव्य 1 में बाद में शामिल हों
- पता है कि तालिका 3 वास्तव में स्टेटमेंट 2

में आवश्यक नहीं है मैं एसक्यूएल के लिए काफी नया हूं, इसलिए कृपया मुझे शिक्षित करें यदि मैं कुछ भी गलत समझ रहा हूं।

+1

मैंने सोचा होगा कि क्वेरी ऑप्टिमाइज़र दोनों के लिए एक ही योजना के साथ आएगा। हालांकि सत्यापित करने के लिए 'EXPLAIN' योजना चलाने का प्रयास करें। –

उत्तर

4

इस कई सारी चीजें (तालिका आकार, सूचकांक, कुंजी वितरण, आदि) पर निर्भर करेगा, तो आप सिर्फ कार्य योजना लागू की जांच होनी चाहिए:

तुम कहते हो नहीं है जो डेटाबेस, लेकिन यहां कुछ तरीके हैं:
MySql EXPLAIN
SQL Server SET SHOWPLAN_ALL (Transact-SQL)
Oracle EXPLAIN PLAN

what is explain in teradata?
Teradata Capture and compare plans faster with Visual Explain and XML plan logging

+0

मुझे पूरा यकीन है कि रसेल ने डीबी कहा था। यह एक http://en.wikipedia.org/wiki/Teradata –

+0

@ कॉनराड Frix, धन्यवाद ठीक है कि, मैंने इसके लिए लिंक जोड़े हैं –

0

जब तक मुझे कुछ याद नहीं आ रहा है, आपको टेबल 1 की आवश्यकता क्यों है ??

बस तालिका 2

Select id, val 
From table2 
WHERE val<100 

क्वेरी या आप एक फिल्टर के रूप में table1 में पंक्तियों का उपयोग कर रहे हैं? यानी, क्या तालिका 1 केवल तालिका 2 में आईडी के उप-समूह को कॉपी करता है ??

यदि हां, तो यह रूप में अच्छी तरह से काम करेगा ...

Select id, val 
From table2 
Where val<100 
    And id In (Select id 
       From table1) 

लेकिन आपके सवाल का जवाब देने के लिए, हाँ क्वेरी अनुकूलक पर्याप्त बुद्धिमान सबसे अच्छा जिस क्रम में आवश्यक कदम निष्पादित करने के लिए यह पता लगाने की होनी चाहिए भौतिक परिणाम में अपने तार्किक निर्देशों का अनुवाद करने के लिए। यह स्ट्रोक आंकड़ों का उपयोग करता है कि डेटाबेस प्रत्येक तालिका पर रखता है कि यह निर्धारित करने के लिए कि क्या करना है (उदाहरण के लिए तर्क का किस प्रकार का उपयोग करना है), जैसा कि डिस्क IOs और प्रसंस्करण लागत को कम करने के लिए संचालन करने के क्रम में wekll के रूप में है।

+3

वैसे वह एक आंतरिक जुड़ाव कर रहा है, इसलिए वह अपने परिणाम सेट को सीमित कर रहा है जहां दोनों टेबलों में मान मौजूद हैं। – JNK

0

क्यू 1। पहले WHERE क्लॉज निष्पादित करें, बाद में स्टेटमेंट 1

बात यह है कि यदि आप आंतरिक शामिल होने का क्रम स्विच करते हैं, यानी टेबल 2 इनरर जॉइन टेबल 1, तो मुझे लगता है कि तैयारी चरण के दौरान जॉइन ऑपरेशन से पहले जहां धारा संसाधित की जा सकती है ।हालांकि, मुझे लगता है कि यदि आप मूल क्वेरी नहीं बदलते हैं, तो भी ऑप्टिमाइज़र अपने ऑर्डर को स्विच करने में सक्षम होना चाहिए, अगर ऐसा लगता है कि जॉइन ऑपरेशन पूरी पंक्ति लाने के साथ बहुत महंगा होगा, तो यह पहले कहां लागू होगा। बस मेरा अनुमान है।

प्रश्न 2। पता है कि स्टेटमेंट 2

टेराडाटा आपकी दूसरी क्वेरी की व्याख्या इस तरह से करेगा कि व्युत्पन्न तालिका आवश्यक है, इसलिए यह प्रसंस्करण तालिका 3 शामिल ऑपरेशन रखेगी।

2

सांख्यिकी और प्रश्न में तालिकाओं के लिए अनुक्रमित की उपलब्धता के आधार अनुकूलक में क्वेरी पुनर्लेखन तंत्र या जहां val < 100 स्कैनिंग Table1 से पहले रिकॉर्ड के लिए Table2 स्कैन करने के लिए विकल्प नहीं चुन सकते सकता है।

डेटा जनसांख्यिकी, जुड़ने, अनुक्रमण और आंकड़ों के आधार पर कुछ स्थितियों में आप पाते हैं कि ऑप्टिमाइज़र क्वेरी प्लान में रिकॉर्ड्स को समाप्त नहीं कर रहा है जब आपको लगता है कि यह चाहिए। यहां तक ​​कि यदि आपके पास एक व्युत्पन्न तालिका है जैसे कि आपके उदाहरण में से एक। आप ऑप्टिमाइज़र को अपनी व्युत्पन्न तालिका में बस ग्रुप BY डाल कर व्युत्पन्न तालिका को संसाधित करने के लिए मजबूर कर सकते हैं। इसके बाद ऑप्टिमाइज़र को आपके उदाहरण में दो तालिकाओं के बीच जुड़ने को हल करने पर विचार करने से पहले ग्रुप बाय समेकित करने के लिए बाध्य किया जाता है।

SELECT table1.id, table3.val 
FROM table1 
INNER JOIN (
    SELECT table2.id, tabl2.val 
    FROM table2 
    WHERE val<100 
    GROUP BY 1,2 
) table3 
ON table1.id=table3.id 

यह कहना नहीं है कि आपका मानक दृष्टिकोण आपके कोड के माध्यम से इसे चलाने के लिए होना चाहिए। यह आमतौर पर मेरे आखिरी रिसॉर्ट्स में से एक है जब मेरे पास एक क्वेरी प्लान है जो योजना में पर्याप्त पहले से मौजूद बाहरी रिकॉर्ड को खत्म नहीं करता है और नतीजे बहुत अधिक डेटा स्कैन किए जाते हैं और विभिन्न SPOOL फ़ाइलों के माध्यम से घूमते हैं। यह एक ऐसी तकनीक है जिसे आप अपने टूलकिट में डाल सकते हैं जब आपको ऐसी स्थिति मिलती है।

क्वेरी पुनर्लेखन तंत्र लगातार एक रिलीज से अगले रिलीज में अपडेट किया जा रहा है और यह कैसे काम करता है इसके बारे में विवरण टेराडाटा 13.0 के लिए SQL Transaction Processing Manual में पाया जा सकता है।