2012-02-02 13 views
8

ओरेकलबल्ककॉपी (ओडीपी.नेट) और एसक्यूएल * लोडर के बीच कुछ महत्वपूर्ण प्रदर्शन अंतर देख रहा हूं जब ओरेकल सर्वर दूसरी मशीन पर है।ओरेकलबल्ककॉपी बनाम एसक्यूएल * लोडर प्रदर्शन

मेरे पास ओरेकल में तीन कॉलम (एक BINARY_FLOAT, दो NUMBER (18,0)) के साथ एक बहुत ही बुनियादी तालिका है। कोई प्राथमिक कुंजी, इंडेक्स, ट्रिगर्स इत्यादि नहीं हैं। डीबी में थोक डेटा प्राप्त करने के लिए इसे स्टेजिंग टेबल के रूप में उपयोग किया जाता है।

एसक्यूएल * लोडर को तालिका में 4.5 मिलियन पंक्तियों को लोड करने के लिए लगभग 27 सेकंड लगते हैं।

ओरेकलबल्ककॉपी केवल 1 मिलियन पंक्तियों को लोड करने में लगभग 10 मिनट लगते हैं।

दस्तावेज के अनुसार ओरेकलबल्ककॉपी, * "... प्रत्यक्ष पथ लोड दृष्टिकोण का उपयोग करता है, जो समान है, लेकिन ओरेकल एसक्यूएल * लोडर के समान नहीं है।" * यह एसक्यूएल * लोडर के साथ नहीं हो सकता है प्रदर्शन के मामले में, लेकिन यह अंतर हास्यास्पद है।

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

एसक्यूएल * लोडर - प्रारंभिक कनेक्शन हेन्डशेकिंग के बाद - 8 किलोबाइट पैकेट (टीएनएस प्रोटोकॉल) की एक श्रृंखला भेजता है और जवाब में 60 बाइट ACKs प्राप्त करता है।

OracleBulkCopy 102 बाइट पैकेट (टीएनएस प्रोटोकॉल) की एक श्रृंखला भेजता है और जवाब में एक 133 बाइट पैकेट (टीएनएस प्रोटोकॉल) प्राप्त करता है। क्या...!? ऐसा लगता है कि यह एक समय में एक पंक्ति भेज रहा है!

ओरेकलबल्ककॉपी कक्षा के साथ, मैं 100,000 का बैच आकार का उपयोग कर रहा हूं और डेटा फ़ाइल से पढ़ने के लिए कस्टम IDataReader का उपयोग कर रहा हूं।

तो, मेरे सवाल कर रहे हैं:

  • क्या कभी किसी ने इस व्यवहार देखा है?

  • क्या ओरेकलबल्ककॉपी वास्तव में थोक लोडिंग टूल के रूप में कार्य करता है?

  • क्या मुझे कुछ ठीक से काम करने के लिए कॉन्फ़िगर करने की आवश्यकता है? (ग्राहक/सर्वर सेटिंग्स, आदि)

किसी भी मदद की बहुत सराहना की जाती है।

+0

मुझे डेटाटेबल का उपयोग करके समान सम्मिलित समय मिल रहा है। इससे भी बदतर, कुछ कॉलम टाइपस्टैम्प प्रकार हैं इसलिए मुझे डेटाटेबल कॉलम को ओरेकलटाइमस्टैम्प प्रकार में सेट करना होगा, जो कि जब मैं एप्लिकेशन को प्रोफाइल करता हूं तो एक अच्छा हिट भी लगता है। क्या आप बल्ककॉपी को बढ़ा सकते थे? Sqlloader चलाने के लिए कमांडलाइन पर बाहर निकलना वेब सर्वर पर बड़ी फ़ाइलों को संभालने के लिए वास्तव में खराब तरीका लगता है! – Dan

उत्तर

4

मुझे ओरेकल के मैनेजर एलेक्स केह से प्रतिक्रिया मिली, कि ओरेकल ने इस मुद्दे को भी देखा है। हम इस बग को ठीक करने का मूल्यांकन कर रहे हैं। "

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

मैं एसक्यूएल * लोडर को वैकल्पिक समाधान के रूप में लपेटूंगा क्योंकि बग फिक्स पर कोई ईटीए नहीं है।

+0

जिज्ञासा से, क्या आपने [सरणी बाध्यकारी] कोशिश की [http://docs.oracle.com/html/B10961_01/features.htm#1025579)? –

+0

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

+0

@AdrianBrown - यदि आप अभी भी इस धागे की निगरानी कर रहे हैं, तो क्या आपको याद है कि कौन सा संस्करण और अगर बग फिक्स पर कोई अपडेट था? – Leigh

1

क्या यह समस्या स्रोत के रूप में डेटाटेबल का उपयोग करते समय भी हो रही है? या यह केवल आईडीटाइडर के उपयोग के कारण है?

+0

अच्छा सवाल। हां, मैंने डेटाटेबल का भी उपयोग करने का प्रयास किया था। मैंने सोचा कि यह IDataReader की स्ट्रीमिंग के साथ कुछ करने के लिए हो सकता है, लेकिन मुझे बिल्कुल वही व्यवहार मिला। यह अभी और अधिक स्मृति का उपयोग किया। :) –

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