2012-06-19 11 views
15

मेरी कंपनी को सिम्बियोटिक साझेदारी द्वारा परजीवी बना दिया गया है। परजीवी से अपना डेटा प्राप्त करने के लिए, हमें एक दर्दनाक धीमी ओडीबीसी कनेक्शन का उपयोग करना होगा। मैंने हाल ही में नोटिस किया है कि मैं समांतर में क्वेरी चलाने के द्वारा अधिक थ्रूपुट प्राप्त कर सकता हूं (यहां तक ​​कि उसी तालिका पर)।एक तालिका के समानांतर में सम्मिलित करने का सबसे तेज़ तरीका

एक विशेष रूप से बड़ी तालिका है जिसे मैं डेटा निकालना चाहता हूं और इसे अपनी स्थानीय तालिका में ले जाना चाहता हूं। समानांतर में चलने वाले प्रश्नों को मैं डेटा तेज़ी से प्राप्त कर सकता हूं, लेकिन मुझे यह भी कल्पना है कि इससे कई प्रश्नों से डेटा को एक ही टेबल में एक ही समय में लिखने का प्रयास किया जा सकता है।

इस स्थिति को सर्वोत्तम तरीके से संभालने के तरीके पर आप मुझे क्या सलाह दे सकते हैं ताकि मैं समांतर में प्रश्नों का उपयोग करने की गति में वृद्धि कर सकूं?

संपादित करें: मुझे यहां कुछ शानदार प्रतिक्रिया मिली है, लेकिन मुझे लगता है कि मैं इस तथ्य पर पूरी तरह स्पष्ट नहीं हूं कि मैं एक लिंक किए गए सर्वर (जो ओडीबीसी ड्राइवरों का उपयोग करता है) के माध्यम से डेटा खींच रहा हूं। दूसरे शब्दों में इसका मतलब है कि मैं सामान्य INSERT कथन चला सकता हूं और मेरा मानना ​​है कि एसकब्लूल्ककॉपी या बल्क इंसर्ट (वास्तव में, मुझे विश्वास नहीं है कि बल्क इंसर्ट भी एक विकल्प होगा) से बेहतर प्रदर्शन प्रदान करेगा।

+0

जैसा कि आपने सुझाव दिया था, समांतर लेखन शायद प्रदर्शन में मदद नहीं करेगा। आपको यहां कुछ जवाब मिल सकते हैं http://stackoverflow.com/questions/2861944/how-do-i-do-very-fast-inserts-to-sql-server-2008 –

+0

क्या आप डेटा माइग्रेट कर रहे हैं? मैं पूछता हूं क्योंकि आपने अपने चलते डेटा को स्थानीय टेबल पर कहा था। इसके अलावा आप कोड में ऐसा कैसे कर रहे हैं जैसे सी # या एसक्यूएल नौकरी के हिस्से के रूप में? –

+0

@mouters हां, लेकिन नया डेटा हमारे डेटाबेस में नहीं आता है इसलिए मुझे दैनिक आधार पर कुछ भी नया प्रतिलिपि बनाना होगा। अब तक मैं इसे हाथ से एसएसएमएस में कर रहा हूं लेकिन समानांतर विचार सी # में किया जाएगा यदि मैं ऐसा करता हूं। शायद समानांतर बी/सी में ऐसा करने वाला नहीं है, मुझे अब सभी ऐतिहासिक डेटा मिल गए हैं और वास्तव में चलाने के लिए एक एसक्यूएल नौकरी स्थापित करने और रात में नए डेटा प्राप्त करने की आवश्यकता है। लेकिन मैं सिर्फ इस विचार पर कुछ जानकारी प्राप्त करना चाहता था कि बी/सी मैंने निकट भविष्य में अन्य सामानों पर इसका उपयोग किया होगा। –

उत्तर

12

क्या आपने Load 1TB in less than 1 hour पढ़ा है?

  1. आपके पास उपलब्ध CPUs के रूप में कई लोड प्रक्रियाएं चलाएं। यदि आपके पास 32 CPU हैं, तो 32 समानांतर भार चलाएं। यदि आपके पास 8 सीपीयू हैं, तो 8 समांतर लोड चलाएं।
  2. यदि आपके पास अपनी इनपुट फ़ाइलों के निर्माण पर नियंत्रण है, तो उन्हें आकार का आकार बनाएं जो लोड समान थ्रेड की संख्या से समान रूप से विभाजित है समानांतर में चलाना चाहते हैं। यह भी सुनिश्चित करें कि यदि आप स्विच विभाजन रणनीति का उपयोग करना चाहते हैं तो सभी रिकॉर्ड एक विभाजन से संबंधित हैं।
  3. यदि आप SQL सर्वर मशीन पर प्रक्रिया चला रहे हैं तो बीसीपी के बजाय बल्क सम्मिलन का उपयोग करें।
  4. एक और 8-10% हासिल करने के लिए टेबल विभाजन का उपयोग करें, लेकिन केवल तभी यदि आपका इनपुट फ़ाइलें आपके विभाजन फ़ंक्शन से मेल खाने के लिए गारंटीकृत हैं, जिसका अर्थ है कि एक फ़ाइल में सभी रिकॉर्ड एक ही विभाजन में होना चाहिए।
  5. एक समय लॉकिंग पर पंक्ति से बचने के लिए टैबलेट का उपयोग करें।
  6. प्रति बैच = 2500 का उपयोग करें, या यदि आप एक तालिका में एकाधिक धाराओं को आयात करते हैं तो इसके पास कुछ उपयोग करें।

    एसक्यूएल सर्वर 2008 के तरीकों है कि यह कम से कम प्रवेश के साथ संभाल कर सकते हैं बढ़ाता है:

एसक्यूएल सर्वर 2008 के लिए, वहाँ कुछ निश्चित परिस्थितियों जहां minimal logging for a standard INSERT SELECT का उपयोग कर सकते हैं। यह न्यूनतम लॉग इन नियमित INSERT SELECT कथन का समर्थन करता है। इसके अलावा, ट्रेस ध्वज 610 पर मोड़ने से SQL सर्वर 2008 नई कुंजी श्रेणियों के लिए एक nonempty बी-पेड़ के खिलाफ न्यूनतम लॉगिंग का समर्थन करता है जो नए पृष्ठों के आवंटन का कारण बनता है।

+0

धन्यवाद, यह अच्छा है लेकिन वास्तव में मेरी स्थिति में लागू नहीं होता है (# 1 के अलावा) क्योंकि मैं फ़ाइल से डेटा लोड नहीं कर रहा हूं लेकिन एक लिंक किए गए सर्वर से odbc ड्राइवरों के माध्यम से ... इसलिए मैं नियमित रूप से सेट आधारित सम्मिलित बयान करता हूं वैसे भी। तो मुझे आश्चर्य है कि मैं एक सामान्य सम्मिलन कथन पर पंक्ति प्रति बैच सेटिंग के बराबर करने के बारे में कैसे जाऊंगा या यदि मैं कर सकता हूं? –

+0

क्या आप SQL Server 2008 या ऊपर का उपयोग कर रहे हैं? मानक INSERT चयन कथन पर न्यूनतम लॉगिंग कुछ परिस्थितियों में समर्थित है। – 8kb

3

अपने वहाँ (System.Data.SqlClient नामस्थान में) SqlBulkCopy उपयोग करने का विकल्प है और इस लेख समानांतर में यह करने के लिए यह संभव है पता चलता है के रूप में में कोड यानी ग # ऐसा करने के लिए देख रहे हैं।

http://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html

+0

कुछ भी थोक करने के बारे में केवल कुछ बुरा यह है कि आपको बाद में इंडेक्स को पुनर्निर्माण करना होगा क्योंकि यह उन्हें सम्मिलित करने पर अनदेखा करता है। – SQLMason

+0

ठीक है, मैं समांतरता को प्रबंधित करने के लिए सी # का उपयोग करने की सोच रहा था। मुझे नहीं लगता कि SqlBulkCopy का उपयोग करने से SqlCommand.ExecuteNonQuery() का उपयोग करने से कहीं अधिक तेज़ होगा, उसी सेट आधारित डालने कथन को जारी करने के लिए मैं सीधे एसएसएमएस से करूँगा, है ना? मुझे लगता है कि भूलने वाले लोगों की एक बात यह है कि यह एक फ्लैट फ़ाइल से नहीं आ रहा है ... मुझे सीधे स्रोत डेटा पर नियमित रूप से सम्मिलित बयान चलाने की सुविधा है। –

+0

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

1

किसी भी संयोग से आप एसक्यूएल 2014 तक अपग्रेड कर दिया है, तो आप समानांतर में सम्मिलित कर सकते हैं (अनुकूलता स्तर 110 होना चाहिए)। इसे देखें: http://msdn.microsoft.com/en-us/library/bb510411%28v=sql.120%29.aspx

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