बड़ी संख्या में पंक्तियों को सम्मिलित करने का सबसे तेज़ तरीका क्या है?


27

मेरे पास एक डेटाबेस है जहां मैं फ़ाइलों को एक स्टेजिंग टेबल में लोड करता हूं, इस स्टेजिंग टेबल से मुझे कुछ विदेशी कुंजियों को हल करने के लिए 1-2 जॉइन होते हैं और फिर इस पंक्तियों को फाइनल टेबल (जिसमें हर महीने एक पार्टीशन होता है) में डालें। तीन महीने के आंकड़ों के लिए मेरे पास लगभग 3.4 बिलियन पंक्तियाँ हैं।

इन पंक्तियों को अंतिम तालिका में रखने से सबसे तेज़ तरीका क्या है? SSIS डेटा फ्लो टास्क (जो स्रोत के रूप में एक दृश्य का उपयोग करता है और तेजी से लोड सक्रिय है) या एक सम्मिलित करें चयन करें .... कमांड? मैंने डेटा फ्लो टास्क की कोशिश की और लगभग 5 घंटे (सर्वर पर 8 कोर / 192 जीबी रैम) में 1 बिलियन पंक्तियों को प्राप्त कर सकता हूं जो मुझे बहुत धीमा लगता है।


1
अलग फ़ाइलग्रुप पर विभाजन हैं (और विभिन्न भौतिक डिस्क पर उन फ़ाइल समूह पर हैं)?
हारून बर्ट्रेंड

3
एक बहुत अच्छा संसाधन डेटा लोड हो रहा है प्रदर्शन गाइड । यह बहुत सारे प्रदर्शन अनुकूलन को संबोधित करता है, जैसे आप B6 OUT / IN, SSIS आदि का उपयोग करके TF610 को सक्षम कर सकते हैं , आपको बस सिफारिशों का पालन करना होगा और इसे अपने वातावरण में परीक्षण करना होगा।
परिजन शाह

@ ऐरॉन हाँ, प्रति माह एक फ़ाइलग्रुप, 12 सान लून संलग्न है, इसलिए सभी जान एक लुन आदि पर जाते हैं। यह सुनिश्चित नहीं है कि प्रति लंक कितने डिस्क हैं लेकिन बहुत होना चाहिए।
nojetlag

हाँ, मैं वास्तव में "डिस्क के सेट" का मतलब था और शायद नियंत्रकों का भी उल्लेख कर सकता था, जो संतृप्त हो सकते हैं।
हारून बर्ट्रेंड

@Kin ने गाइड पर एक नज़र डाली थी, लेकिन यह पुराना लग रहा है, "SQL सर्वर गंतव्य SQL सर्वर पर इंटीग्रेशन सर्विसेज डेटा प्रवाह से बल्क डेटा लोड करने का सबसे तेज़ तरीका है। यह गंतव्य SQL सर्वर के सभी बल्क लोड विकल्पों का समर्थन करता है - ROWS_PEG_BATCH को छोड़कर। । " और SSIS 2012 में वे बेहतर प्रदर्शन के लिए OLE DB गंतव्य की सिफारिश करते हैं।
nojetlag

जवाबों:


25

एक आम दृष्टिकोण:

  1. लक्ष्य तालिका में अनुक्रमणिका / बाधाओं को अक्षम / ड्रॉप करें।
  2. INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
  3. जेएनके को क्रेडिट के साथ, आप उपरोक्त nपंक्तियों के बैचों में कर सकते हैं, जो लेनदेन लॉग पर तनाव को कम कर सकता है, और निश्चित रूप से इसका मतलब है कि यदि कुछ बैच विफल रहता है, तो आपको केवल उस बैच से शुरू करना होगा। मैंने इस बारे में ब्लॉग किया (जबकि हटाए जाने के संदर्भ में, वही मूल अवधारणाएं यहां लागू होती हैं): http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes
  4. लक्ष्य तालिका पर अनुक्रमणिका / अवरोधों को फिर से सक्षम / पुन: बनाएँ (और शायद आप उनमें से कुछ को स्थगित कर सकते हैं, यदि वे सभी कार्यों के लिए आवश्यक नहीं हैं, और आधार डेटा को जल्दी से ऑनलाइन प्राप्त करना अधिक महत्वपूर्ण है)।

यदि आपके विभाजन भौतिक हैं और केवल तार्किक नहीं हैं, तो आप अलग-अलग प्रक्रियाओं को एक साथ अलग-अलग विभाजन करके कुछ समय प्राप्त कर सकते हैं (बेशक इसका मतलब है कि आप उपयोग नहीं कर सकते TABLOCK/ TABLOCKX)। यह मानता है कि स्रोत ओवरलैपिंग / लॉकिंग आदि के बिना चयन करने वाली कई प्रक्रियाओं के लिए भी उपयुक्त है, और ऑपरेशन के उस पक्ष को भी धीमा बना देता है (संकेत: स्रोत पर एक क्लस्टर इंडेक्स बनाएं जो गंतव्य पर विभाजन योजना को सूट करता है)।

आप किसी चीज़ को बहुत अधिक आदिम भी मान सकते हैं, जैसे BCP OUT/BCP IN

मुझे नहीं पता कि मैं इसके साथ मदद करने के लिए SSIS में कूद जाऊंगा। वहाँ शायद कुछ क्षमताएँ हैं, लेकिन मुझे नहीं पता कि प्रयास बचत को सही ठहराते हैं।


2
यदि आपके डेटा को सॉर्ट नहीं किया गया है, तो इंडेक्स (esp। क्लस्टर इंडेक्स) को आँख बंद करके न छोड़ें। इंडेक्स को गिराना और एक क्लस्टर इंडेक्स को फिर से बनाने की उम्मीद करना एक बहुत बड़ी गलती हो सकती है क्योंकि इसमें भारी डिस्क स्थान और भारी मात्रा में दोनों समय खर्च हो सकते हैं। मैं ऐसी गलती का अनुभव करने वाला पहला व्यक्ति नहीं हूं। इस आलेख में "प्लान बी" विवरण देखें sqlmag.com/t-sql/… । लेखक का भी यही मुद्दा था।
जिओ

10

SSIS के नजरिए से आपकी समस्या को देखते हुए मुझे लगता है कि यह कारण इतना लंबा हो सकता है कि आपके पास बैचिंग नहीं है। यह SSIS पाइपलाइन को भरने के लिए बहुत अधिक पंक्तियों को जन्म दे सकता है और परिणामस्वरूप आपके SSIS प्रदर्शन में बाधा उत्पन्न कर सकता है। आपको जो करने की आवश्यकता है वह प्रति बैच सेटिंग में आपकी पंक्तियों को बदलने और संभवतः आपके अधिकतम सम्मिलित प्रतिबद्ध आकार है। अब आप इसे क्या सेट करते हैं, यह आपके SSIS सर्वर पर उपलब्ध मेमोरी की मात्रा पर निर्भर करेगा। आपकी SQL सर्वर आवृत्ति की डिस्क गति क्या है? ऐसा करने का सबसे अच्छा तरीका परीक्षण है। उदाहरण के लिए चलो 10,000 का उपयोग करें। यह समय पर सर्वर को एक बैच भेजेगा, इस प्रकार आपकी पाइपलाइन को ओवरफिलिंग से दूर रखेगा और इस प्रक्रिया को तेजी से चलाने में मदद करेगा। ये सेटिंग आपके OLEDB गंतव्य में सेट की गई हैं।

OLEDB गंतव्य

यदि यह एक समस्या है, तो आप @AaronBertrand के सुझाव के अनुसार और उसके बाद एक निष्पादित SQL कार्य भी जोड़ सकते हैं और तालिका में किसी भी अनुक्रमणिका या बाधा को हटा सकते हैं / हटा सकते हैं।


1
DBA.SE: dba.stackexchange.com/questions/141430/… पर "फास्ट लोड" कहीं और क्या होता है, इस बारे में एक उत्कृष्ट प्रश्न है ।
जॉन ऑफ ऑल ट्रेड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.