2010-04-12 13 views
8

में एक एकल INSERT के साथ एकाधिक पंक्तियां मैं एक एकल INSERT कथन के साथ एकाधिक पंक्तियों को डालने की गति का परीक्षण कर रहा हूं।SQLServer 2008

उदाहरण के लिए: INSERT INTO [MyTable] मान (5, 'कुत्ते'), (6, 'बिल्ली'), (3, 'मछली)

यह बहुत तेजी से है, जब तक मैं पर 50 पंक्तियों पारित एक बयान, तो गति में काफी गिरावट आई है।

50 बैचों के साथ 10000 पंक्तियां डालने से 0.9 सेकंड लगते हैं। 51 के बैचों के साथ 10000 पंक्तियां डालने से 5.7 सेकंड लगते हैं।

  1. क्यों 50 में इस तरह के एक कठिन प्रदर्शन गिरावट है:

    मेरा प्रश्न के दो भाग हैं?

  2. क्या मैं इस व्यवहार पर भरोसा कर सकता हूं और 50 से बड़े बैचों को कभी भी भेजने के लिए अपने आवेदन को कोड कर सकता हूं?

मेरे परीक्षण सी ++ और एडीओ में किए गए थे।

संपादित करें: ऐसा लगता है कि ड्रॉप ऑफ पॉइंट 50 पंक्तियां नहीं है, लेकिन 1000 कॉलम हैं। मुझे 20 कॉलम की 50 पंक्तियों या 10 कॉलम की 100 पंक्तियों के साथ समान परिणाम मिलते हैं।

+0

मुझे एहसास है कि इनपुट की पार्सिंग के कारण यह और भी खराब हो जाता है। – Andrey

+2

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

उत्तर

0

क्या आपने यहां दिखाए गए "यूनियन ऑल" दृष्टिकोण से भी तुलना की थी? http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/

मुझे संदेह है कि एक आंतरिक कैश/इंडेक्स है जो 50 पंक्तियों तक उपयोग किया जाता है (यह एक अच्छा दौर दशमलव संख्या है)। 50 पंक्तियों के बाद यह कम कुशल सामान्य केस सम्मिलन एल्गोरिदम पर वापस आ जाता है जो अत्यधिक स्मृति का उपयोग किये बिना इनपुट की मनमानी मात्रा को नियंत्रित कर सकता है।

+0

बस यूनियन के सभी दृष्टिकोण की कोशिश की। यह भी काफी धीमी है। 10000 पंक्तियों के लिए लगभग 7 सेकंड। – Todd

0

मंदी शायद स्ट्रिंग मानों का पार्सिंग है: VALUES (5, 'dog'), (6, 'cat'), (3, 'fish) और एक आईएनएसईआरटी मुद्दा नहीं।

INSERT INTO YourTable1 
    (col1, col2) 
    SELECT 
     Value1, Value2 
     FROM YourTable2 
     WHERE ...--rows will be more than 50 

और देखो क्या होता

0

आप एसक्यूएल 2008 का उपयोग कर रहे हैं, तो आप तालिका मान का उपयोग कर सकते हैं:

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

व्यक्तिगत रूप से, मैंने नियमित बैचों के साथ भी 50 आवेषण रिकॉर्ड में मंदी देखी नहीं है। भले ही हम टेबल वैल्यू पैरामीटर में चले गए, जिसमें हमारे लिए महत्वपूर्ण गति वृद्धि हुई थी।

+0

मैंने यह कोशिश की, और एक एसक्यूएल नौसिखिया के रूप में, मुझे यकीन नहीं है कि मैं इसे सबसे इष्टतम तरीके से कर रहा हूं। हालांकि बैच आकार के आधार पर, मेरे परीक्षण 600 से 30 सेकंड प्रति 10000 पंक्तियों में कहीं भी दिखाते हैं। बहु पंक्ति INSERT कथन के करीब कुछ भी नहीं। – Todd

+0

यह बहुत अजीब है। क्या आप तालिका में सभी फ़ील्ड असाइन कर रहे हैं या कुछ कॉलम डिफ़ॉल्ट मानों के माध्यम से असाइन किए गए हैं? यदि बाद में, ये महंगा हो सकता है (getdate() फ़ंक्शन की तरह) ... – NotMe

+0

मैंने यहां उदाहरण का पालन किया: http://msdn.microsoft.com/en-us/library/bb510489%28SQL.100%29। एएसपीएक्स लेकिन किसी अन्य तालिका से अस्थायी तालिका में डालने की बजाय, मैं एक बहु पंक्ति डालने का उपयोग करके मान डालता हूं। मैं सभी मान निर्दिष्ट करता हूं, कोई डिफ़ॉल्ट नहीं। – Todd

0

रैंडम विचार:

  • जब बार-बार चलाने यह पूरी तरह से संगत है?
  • क्या आप दूसरी 10k पंक्तियों के लिए पहली 10k पंक्तियों में डुप्लिकेट की जांच कर रहे हैं?
  • क्या आपने पहले 51 के बैच आकार का प्रयास किया था?
  • क्या आपने परीक्षणों के बीच तालिका खाली कर दी है?
+0

हां यह बहुत संगत है। और मैं प्रत्येक टेस्ट के बीच तालिका खाली करता हूं। – Todd

+0

@ टोड: दिलचस्प। अच्छा प्रश्न। और मेरे पास कोई और विचार नहीं है हालांकि :-) – gbn

2

यह पंक्ति के आकार से भी संबंधित हो सकता है। एक उदाहरण के रूप में उपयोग की जाने वाली तालिका में केवल 2 कॉलम होते हैं। क्या होगा यदि इसमें 25 कॉलम हों? प्रदर्शन 50 पंक्तियों पर भी बंद हो गया है?

+0

दिलचस्प है। उपर्युक्त तालिका सिर्फ एक उदाहरण थी, मेरी वास्तविक तालिका में 20 कॉलम हैं। मैंने 10 तक काट दिया और फिर कोशिश की। अब मुझे 100 पर कट ऑफ मिल गया है। 100 के बैच लगभग 0.6 सेकंड लेते हैं। 101 के बैच लगभग 3.25 सेकंड लेते हैं। ऐसा लगता है कि सीमा 50 पंक्तियां नहीं है, लेकिन 1000 व्यक्तिगत अद्यतन फ़ील्ड हैं? – Todd

+0

ऐसा लगता है जैसे कटऑफ स्मृति में कुल डेटा की तरह है। यदि कोई टेबल छोटा है, तो शायद आप "पंक्ति" में 100 पंक्तियों को फिट कर सकते हैं, जो भी ब्लॉक है। लेकिन कई कॉलम या कुछ बड़े कॉलम के साथ बड़ी टेबल (उदा।, वर्चर (1200)) उन पंक्तियों की संख्या को सीमित कर देगी जिन्हें आप ब्लॉक में फिट कर सकते हैं। – MJB

0

उच्च मात्रा और उच्च आवृत्ति प्रविष्टियों के लिए, अपने डेटा को लोड करने के लिए Bulk Inserts का उपयोग करने पर विचार करें। वह दुनिया को लागू करने की सबसे सरल चीज नहीं है और यह चुनौतियों का एक नया सेट लाती है, लेकिन यह INSERT करने से कहीं अधिक तेज़ हो सकती है।

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