2009-07-29 18 views
6

मैं एक रिकॉर्ड में एन रिकॉर्ड डालना चाहता हूं। कई समवर्ती उपयोगकर्ता हो सकते हैं और वे इस तालिका से डेटा डालने/अपडेट/चुन सकते हैं। ऐसी तालिका में डालने का बेहतर तरीका क्या है 1000 रिकॉर्ड:एसक्यूएल सम्मिलित क्वेरी प्रदर्शन

  1. एकाधिक प्रविष्टियों वाले डेटाबेस में एक एकल SQL क्वेरी भेजें। यह सर्वर को डेटाबेस कॉल पर सहेजता है, लेकिन (मुझे यकीन नहीं है) प्रविष्टि समाप्त होने तक तालिका को ताला लगा देता है और इस तालिका के सभी अन्य प्रश्न प्रतीक्षा करेंगे।
  2. कुछ हिस्सों में 1000 रिकॉर्ड विभाजित करें और उन्हें कई एसक्यूएल प्रश्नों में भेजें। यह तालिका पर अन्य प्रश्नों को निष्पादित करने देता है, लेकिन डेटाबेस कॉल पर सर्वर पर समय बिताता है।

क्या यह किसी चीज़ पर निर्भर करता है, या एक ऐसा तरीका है जो हमेशा इष्टतम होता है? क्या यह निर्भर करता है कि डेटा डालने के दौरान लेनदेन का उपयोग किया जाता है या नहीं? क्या ऐसी कोई प्रविष्टि करने के लिए अन्य बेहतर तरीके हैं?

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

उत्तर

6

यह पूरी तरह से RDBMS पर निर्भर करता है जो आप उपयोग कर रहे हैं।

Oracle में, लिखते हैं कभी भी पढ़ना बंद नहीं करते हैं, यही कारण है कि आप सुरक्षित रूप से अपने डेटा को एक साथ रख सकते हैं। नोट, हालांकि, यह प्रदर्शन को कम कर देगा, क्योंकि समवर्ती प्रश्नों को UNDO टेबलस्पेस से डेटा लाने की आवश्यकता होगी जिसके लिए अतिरिक्त पढ़ने की आवश्यकता होगी।

SQL Server में लिखा गया है कि जब ब्लॉक TRANSACTION ISOLATION LEVELSNAPSHOT पर सेट की जाती है, तब तक प्रभावित पंक्तियों/पृष्ठों/तालिकाओं (लॉक एस्केलेशन मुद्दों के आधार पर) ब्लॉक को पढ़ता है।

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

Oracle में, पुराने डेटा को UNDO टेबलस्पेस में कॉपी किया गया है।

SQL Server में, यह tempdb में कॉपी हो जाता है (केवल SNAPSHOT अलगाव सक्षम है, अन्यथा यह अभी लॉक है)।

इसे हमेशा कुछ संसाधनों (मेमोरी या डिस्क) की आवश्यकता होती है, और यदि आप UPDATE क्वेरी बहुत सारी पंक्तियों को प्रभावित करते हैं तो आप इन संसाधनों से बाहर निकल सकते हैं।

1

एक अलगाव (समवर्ती) स्तर सेट करें जो लेनदेन के दौरान पुराने डेटा के पढ़ने की अनुमति देता है - उदा। एसक्यूएल सर्वर 2005+ ने स्नैपशॉट पढ़ा है।

2

मैंने इस a while ago के बारे में ब्लॉग किया - मुझे लगता है कि पोस्ट आपके कुछ प्रश्नों का उत्तर देता है। सीके की सलाह ध्वनि है (और क्वास्नोई है- उसके पास ओरेकल के बारे में कुछ अच्छे मुद्दे हैं) यदि आप लेखकों को अवरुद्ध करने वाले पाठकों के बारे में चिंतित हैं।

+0

दिलचस्प ब्लॉग पोस्ट +1। यह आपकी रुचि को चित्रित करता है क्योंकि _reason_ लेन-देन आपके परीक्षण में तेज़ी से दिखाई देता है। मुझे संदेह है कि ऐसा इसलिए है क्योंकि कई आवश्यक ताले पहले से ही पास हो चुके हैं। हालांकि, एक महत्वपूर्ण बात यह है कि आपकी पोस्ट को संबोधित नहीं किया जाता है, वह भार के तहत व्यवहार है। आपके परीक्षण अलगाव में प्रतीत होते हैं; एक लाइव सिस्टम में मुझे संदेह है कि परिणाम बहुत जल्दी बदल जाएंगे। – EBarr

2

सामान्य नियम यह है कि आपको डेटाबेस को यह समझने देना चाहिए कि काम कैसे करें। यह बेहतर काम करता है जितना आप इसे एक बयान में करने के लिए कहते हैं, यानी आपको एक ही समय में 1000 रिकॉर्ड डालना चाहिए। यह के लिए सबसे अच्छा काम करेगा डेटाबेस सर्वर और अधिकांश सर्वर लिखने के लिए पढ़ता नहीं है।

अपवाद हैं: यदि सम्मिलन धीमा है या सर्वर धीमा है या तालिका बड़ी या जटिल है क्वेरी को छोटे आवेषण समूहों में विभाजित करने के लिए बेहतर हो सकता है।

विधि के बीच एक सर्वर में एक बड़ी स्क्रिप्ट के बीच में 10 या 100 पंक्तियों के साथ कई सम्मिलित आदेश भेजने के लिए होगा।

जोड़ा गया: अधिकांश डेटाबेस सर्वर ओरोकल, आईबीएम डीबी/2 और माईएसक्यूएल में इनो डीबी टेबल का उपयोग करके पढ़ने को अवरुद्ध नहीं करते हैं। दूसरी ओर SQL सर्वर पढ़ने के लिए भी टेबल लॉक करने का प्रबंधन करता है और उनमें से नहीं है।

+1

मुझे लगता है कि आपको लगता है कि अधिकांश डीबी में ऐसे मुद्दे होंगे जहां पाठक लेखकों को अवरुद्ध करते हैं (ओरेकल नहीं करता है)। – RichardOD

+0

माइक्रोसॉफ्ट एडीओ.NET कोर संदर्भ 100 और 1000 के बीच बैच आकार का उपयोग करने की सिफारिश करता है। – RichardOD

+0

@ रिचर्डोड: क्या आप इस सिफारिश के लिए एक लिंक पोस्ट कर सकते हैं? – Kamarey

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