2012-01-20 10 views
5

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

मुझे यह भी बताया गया था कि अधिकांश डेटाबेस को लेखन के बजाय पढ़ने पढ़ने के लिए अत्यधिक अनुकूलित किया जाता है, तो धीमी गति से त्वरित जांच तेज नहीं होगी?

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

धन्यवाद।

उत्तर

7

यदि सूचकांक उल्लंघन के कारण सम्मिलन विफल होने जा रहा है, तो रिकॉर्ड की मौजूदगी की तुलना में यह सबसे मामूली धीमी गति से होगा। (दोनों को यह जांचने की आवश्यकता है कि सूचकांक में मूल्य है या नहीं।) यदि सम्मिलन सफल होने जा रहा है, तो दो प्रश्न जारी करना एक जारी करने से काफी धीमा है।

0

आप INSERT IGNORE का उपयोग कर सकते हैं ताकि यदि कुंजी पहले से मौजूद है, तो सम्मिलित आदेश को केवल अनदेखा कर दिया जाएगा, अन्यथा नई पंक्ति डाली जाएगी। इस तरह आपको एक प्रश्न जारी करने की आवश्यकता है, जो डुप्लिकेट मानों की जांच करता है और साथ ही साथ नए मान भी डालता है।
अभी भी इंसर्ट इग्नोर से सावधान रहें क्योंकि यह हर त्रुटि को चेतावनी में बदल देता है। पढ़ें डालने के लिए इस पोस्ट की अनदेखी
On duplicate key ignore?

0

मुझे लगता है कि सम्मिलित ध्यान न दें जांच .... यहाँ इस्तेमाल किया जा सकता है, या तो डालने या इसे अनदेखा करेगा। यदि आप IGNORE कीवर्ड का उपयोग करते हैं, तो INSERT कथन निष्पादित करते समय होने वाली त्रुटियों को इसके बजाय चेतावनियों के रूप में माना जाता है। उदाहरण के लिए, IGNORE के बिना, एक पंक्ति जो मौजूदा यूनिक इंडेक्स या तालिका में प्राथमिक कुंजी मान को डुप्लिकेट करती है, डुप्लिकेट-कुंजी त्रुटि का कारण बनती है और कथन निरस्त हो जाता है। इग्नोर के साथ, पंक्ति अभी भी डाली नहीं गई है, लेकिन कोई त्रुटि जारी नहीं की गई है।

0

यदि आप पुराने मान को हटाना चाहते हैं और एक नया मान डालना चाहते हैं तो आप REPLACE का उपयोग कर सकते हैं आप पुराने पंक्तियों को ओवरराइट करने के लिए INSERT के बजाय REPLACE का उपयोग कर सकते हैं।

वास्तव में सम्मिलित की तरह काम करता है, को छोड़कर यदि तालिका में एक पुराने पंक्ति प्राथमिक कुंजी या एक अद्वितीय सूचकांक के लिए एक नई पंक्ति जितना समान मान है, पुराने पंक्ति से पहले नई पंक्ति सम्मिलित किया जाता है हटा दिया गया है कि बदलें।

अन्य INSERT IGNORE का उपयोग करें क्योंकि यह या तो सम्मिलित या अनदेखा करेगा।

एक पंक्ति जो मौजूदा यूनिक इंडेक्स या तालिका में प्राथमिक कुंजी मान को डुप्लिकेट करती है, डुप्लिकेट-कुंजी त्रुटि का कारण बनती है और कथन निरस्त हो जाता है। इग्नोर के साथ, पंक्ति अभी भी डाली नहीं गई है, लेकिन कोई त्रुटि जारी नहीं की गई है।

0

यदि आपका इरादा डालने के लिए है तो क्या यह नया रिकॉर्ड है या रिकॉर्ड अपडेट करें यदि यह पहले से मौजूद है तो यूपीएसईआरटी करने के बारे में कैसे?

चेक आउट - http://vadivel.blogspot.com/2011/09/upsert-insert-and-update-in-sql-server.html

इसके बजाय जाँच रिकॉर्ड मौजूद है या हम इसे सीधे अद्यतन करने के लिए नहीं की कोशिश कर सकते हैं कि क्या की

। यदि कोई मिलान रिकॉर्ड नहीं है तो @@ रोकाउंट 0 होगा। इसके आधार पर हम इसे एक नए रिकॉर्ड के रूप में सम्मिलित कर सकते हैं।[एसक्यूएल सर्वर 2008 में आप इस के लिए मर्ज अवधारणा का उपयोग कर सकते हैं]

संपादित करें: कृपया ध्यान दें, मैं इस एमएस एसक्यूएल सर्वर के लिए काम करता है और मैं MySQL या Oracle

के बारे में पता नहीं है
संबंधित मुद्दे