2012-06-05 8 views
6

मैं दो तालिकाओं की है। और उनमें से प्रत्येक में 100 रिकॉर्ड हैं।आंतरिक जुड़ाव का उपयोग न करना बेहतर क्यों है?</p> <pre><code>table1 (id, name, connte) table2 (id, name, connte) </code></pre> <p>वे <strong>table1.connte</strong> और <strong>table2.connte</strong> के माध्यम से जुड़े हुए हैं:

DELETE d1,d2 FROM table1 d1 INNER JOIN table2 d2 ON d1.connte= d2.connte WHERE d1.id = 20 

या निम्नलिखित:

select connte from table1 where id = 20 
    --Store connte in a variable say aabc-- 
    delete from table2 where connte = aabc -> execute this first 
    delete from table1 where id = 20 -> execute this second 

अब अगर मैं आईडी = 20 और table2 में उसके संगत बच्चों के साथ table1 से एक रिकॉर्ड को हटाना चाहते हैं, जो ऐसा करना बेहतर है

यदि रिकॉर्ड के लिए केवल एक ही माता-पिता और एक बच्चा है जिसे मैं हटाना चाहता हूं (यहां table1.id = 20), तो क्या पूरे टेबल के लिए आंतरिक शामिल होना महंगा नहीं है?

मैं इस सवाल को जावा (इसलिए जेडीबीसी) से चला रहा हूं, तो क्या यह उपर्युक्त स्थिति के लिए कई प्रश्नों या आंतरिक जुड़ाव चलाने के लिए अधिक महंगा (प्रदर्शन के अनुसार) है?

नोट: तालिकाओं के लिए कोई संदर्भित अखंडता मानना ​​नहीं। तो, मैं कैस्केड डिलीट का उपयोग नहीं कर रहा हूँ।

उत्तर

6

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

इसके अलावा, आपको शायद इस छोटे से तालिकाओं के प्रदर्शन को हटाने के बारे में चिंता करने की आवश्यकता नहीं होगी। 100 x 100 पंक्तियां अभी भी बहुत छोटी हैं, इसलिए आपकी डीबीएमएस किसी समस्या के बिना इसे संभालने में सक्षम होना चाहिए।

+0

हम्म..ओक, लेकिन मेरे पास क्या है, सौ लाख या दस लाख रिकॉर्ड कहें? मेरी निर्दिष्ट स्थिति के लिए कौन सा दृष्टिकोण बेहतर होगा? – Harke

+0

मैं अभी भी डीबीएमएस को इसे संभालने की अनुशंसा करता हूं। यह जानता है कि आप इन अनुकूलन को संभवतः बेहतर तरीके से कैसे कर सकते हैं। – Oleksi

+0

क्या कोई तरीका है कि मैं जान सकता हूं कि आंतरिक कैसे काम करता है? लाखों रिकॉर्ड के साथ दो तालिकाओं में शामिल नहीं होंगे, समय लें? (ऑन क्लॉज के साथ फ़िल्टर करने के बाद भी, एक संभावना है कि इसमें शामिल होने के लिए बहुत सारे रिकॉर्ड हैं) – Harke

3

ऐसा करने का सबसे अच्छा तरीका आपके डीबीएमएस में दोनों प्रश्नों पर एक व्याख्या योजना चलाने के लिए है, और आउटपुट आपको आई/ओ अनुमानों जैसी चीजें देता है। आम तौर पर, जब भी आपके पास कोई सवाल है कि और क्या होगा एक डीबीएमएस परिप्रेक्ष्य से कुशल, क्वेरी योजनाओं और लागत अनुमानों को देखते हुए आपका सबसे अच्छा हथियार है।

SET showplan on 

SQL सर्वर में काम करना चाहिए। यहां MSDN documentation है, आपको अपने डीबीएमएस के आधार पर थोड़ा अलग वाक्यविन्यास की आवश्यकता हो सकती है। I/O लागत अनुमान संभवतः आप सबसे ज्यादा परवाह करते हैं।

MySQL के लिए, ऐसा लगता है के बारे में बताएं का उपयोग कर विश्लेषण करने प्रश्नों पर

EXPLAIN SELECT * FROM some_table 

Here is a tutorial उपयोग कर सकते हैं लग रहा है।

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

एक हटाई गई क्वेरी के लिए, गति के लिए सुनिश्चित करने के लिए एक महत्वपूर्ण बात यह है कि आपका डिलीट क्लॉज अनुक्रमित पैरामीटर का उपयोग कर रहा है, इस प्रकार पूर्ण तालिका स्कैन नहीं कर रहा है। समझाएं/शोप्लान आपको बताएगा कि आपकी क्वेरी किस प्रकार की स्कैन कर रही है, और इसका उपयोग किस सूचकांक में किया जा रहा है। आप आम तौर पर पूर्ण टेबल स्कैन से बचना चाहते हैं।

1

एसक्यूएल सर्वर में आप एक हटाए गए कथन में दो तालिकाओं से हटा नहीं सकते (ट्रिगर या कैस्केड डिलीट के बिना)।

+0

होने जा रहा है, इसलिए, मेरे मामले में (जिसमें कोई संदर्भित अखंडता नहीं है और कोई ट्रिगर्स नहीं है), केवल दूसरी शर्त संभव है? – Harke

+0

हाँ, एसक्यूएल सर्वर के लिए, माइस्क्ल अलग हो सकता है – HLGEM

0

क्यों विदेशी कुंजी और कैस्केडिंग डेली का उपयोग करने पर विचार नहीं करते? यदि आप अपनी मेज को सही तरीके से सेट करते हैं तो आपको केवल माता-पिता को हटाना होगा और फिर बच्चे को स्वचालित रूप से देखभाल की जाएगी। यह लिंक देखें When/Why to use Cascading in SQL Server?

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