2008-09-21 6 views
9

मुझे सी # कोड मिला है जो ओडीबीसी के माध्यम से MySQL तक पहुंचता है।हजारों इन्सर्ट के साथ MySQL लेनदेन - कितने "राउंड ट्रिप" लेते हैं?

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

उत्तर

18

MySQL एक विस्तारित एसक्यूएल शैली है कि इस्तेमाल किया जा सकता है, जहां बड़े पैमाने पर आवेषण एक समय में कई में डाल रहे हैं:

INSERT INTO `table` (`id`, `event`) VALUES (1, 94263), (2, 75015), (3, 75015); 

मैं आमतौर पर एसक्यूएल चलाने से पहले एक स्ट्रिंग में कुछ सौ डालने-भागों एकत्रित करेगा खुद से पूछो यह स्वयं को बैच करके पार्सिंग और संचार के ऊपरी हिस्से को कम कर देगा।

+1

कोई विचार है कि कितने सेट कोष्ठक(),(),() को 'बड़े' के रूप में माना जाना चाहिए? मेरा मतलब यह है कि, 1 क्वेरी में कितनी विस्तारित डालने वाली पंक्तियों (VALUES के बाद कोष्ठक के सेट) के बाद हमें एक नई क्वेरी बनाने पर विचार करना चाहिए? – Swanand

+1

यह डेटा के आकार के आधार पर निर्भर करता है, लेकिन यह व्यक्तिगत पसंद और डेटाबेस यातायात सीमाओं के बीच टॉस-अप है (उदाहरण के लिए माइस्क्ल का 'अधिकतम अनुमत पैकेट' आकार)। मैं आम तौर पर लगभग 100 के आसपास करता हूं। यदि प्रति पैकेट कम है तो यह थोड़ा अतिरिक्त समय है, और मैं किसी भी समस्या का जोखिम नहीं लेना चाहता हूं। –

0

अपना कोड देखने के बिना कहना मुश्किल है, लेकिन मुझे लगता है कि आप एक समय में बयान निष्पादित कर रहे हैं। तो, आपको प्रति सम्मिलन कथन के लिए एक राउंड ट्रिप मिलेगी।

MSSQL में आप एक ही बयान में अनेक निवेशन पर अमल कर सकते हैं:

cmd.ExecuteNonQuery "insert table values (1) insert table values (2)" 

तो तुम एक बड़ी स्ट्रिंग बनाने और इसे निष्पादित कर सकते हैं (मुझे लगता है कि यह एक सीमा होती है), मुझे लगता है यह MySQL के लिए काम करेंगे ।

इसके अलावा एमएसएसक्यूएल में आपके पास बैच इंसर्टर (लुकअप "एसकब्लूल्ककॉपी") है, माईएसक्यूएल में शायद loading the data from a temp file आज़माएं।

+0

मुझे MySQL के ओडीबीसी कनेक्शन के बारे में पता नहीं है, लेकिन MySQL स्वयं एक ही निष्पादन में कई आदेशों को संगत करने की अनुमति देता है। इसके अलावा, आप smth कर सकते हैं। जैसे "तालिका मूल्यों में प्रवेश करें ('हैलो', 'अलविदा'), ('क्या', 'कभी');" इसलिए निकफ के सवाल का जवाब देने के लिए दी गई जानकारी थोड़ी मुश्किल है। :) – hangy

2

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

यह संभव है, MySQL में, "विस्तारित डालने" वाक्यविन्यास का उपयोग करने के लिए जो आपको एक ही कथन में कई (या वास्तव में, कई) पंक्तियों को सम्मिलित करने की अनुमति देता है। इसे आम तौर पर एक अच्छी बात माना जाता है।

0

कुछ साल पहले MySQL 4.x का उपयोग करते समय, हम क्वेरी आकार पर एक कठिन सीमा में भाग गए जो कॉन्फ़िगर करने योग्य नहीं था।

यह शायद आप ज्यादा मदद नहीं करेगा के रूप में:

  1. मुझे याद नहीं क्या हार्ड सीमा था।
  2. शायद आप MySQL 4.x का उपयोग नहीं कर रहे हैं।
  3. हम लेनदेन का उपयोग नहीं कर रहे थे।

शुभकामनाएं!

2

डीबी सर्वर के लिए एक राउंड ट्रिप डिस्क पर डेटाबेस के लिए एक राउंड ट्रिप के समान नहीं है।

इससे पहले कि आप तय करें कि राउंड ट्रिप एक बाधा है, कुछ वास्तविक माप करें।

आपके डीबीएमएस के आधार पर, एकल प्रविष्टि के साथ कई पंक्तियों को सम्मिलित करने के तरीके हैं। कोडिंग प्रयास का निवेश करने से पहले, यह पता लगाएं कि क्या यह आपको कोई अच्छा करने की संभावना है।

0

यह इस बात पर निर्भर करता है कि आपने SQL कथन का आह्वान किया है। मैंने इसे एक बार MySQL जेडीबीसी ड्राइवर के साथ करने की कोशिश की और कहा कि सीमा 1 एमबी है लेकिन यह कॉन्फ़िगर करने योग्य है।

मैंने इसे कॉन्फ़िगर करने की कोशिश करने के लिए परेशान नहीं किया और केवल SQL कथन को छोटे टुकड़ों में विभाजित किया।

4

प्रति पंक्तियों की संख्या पर कोई सीमा नहीं है; सीमा सर्वर पर स्थानांतरित बाइट्स की संख्या पर है।

आप 'अधिकतम अनुमत पैकेट' में निर्दिष्ट बाइट्स की संख्या तक थोक सम्मिलित कर सकते हैं। अगर मैं कम से कम आवेषण का उपयोग करना चाहता था तो मैं कोशिश करूँगा।

0

भेजे जाने वाले डेटा की सीमा आपके सर्वर पर निर्भर करती है ताकि एकाधिक डालने वाले बयानों की अधिकतम लंबाई फिट करने के लिए स्वचालित रूप से समायोजित हो। बाधा एक पैकेट लंबाई और एक बफर लंबाई है।

अधिक जानकारी के लिए net_buffer_length और max_allowed_packet चर वर्णन देखें:

https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_net_buffer_length https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_allowed_packet

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

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