बल्क इंसर्ट समय में बड़े बदलाव


13

इसलिए हमारे पास हमारे मंचन तालिका से डेटा लेने और इसे हमारे डेटामार्ट में ले जाने के लिए एक सरल बल्क इंसर्ट प्रक्रिया है।

प्रक्रिया "पंक्तियों प्रति बैच" के लिए डिफ़ॉल्ट सेटिंग्स के साथ एक सरल डेटा प्रवाह कार्य है और विकल्प "टैबलॉक" और "नो चेक बाधा" हैं।

मेज काफी बड़ी है। 20187 और 49GB इंडेक्स स्पेस के डेटा साइज़ के साथ 587,162,986। तालिका के लिए संकुल सूचकांक है।

CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
    DOC_ID ASC,
    ACCT_NUM ASC,
    MasterID ASC
)

और प्राथमिक कुंजी है:

ALTER TABLE dbo.ImageData 
ADD CONSTRAINT ImageData 
PRIMARY KEY NONCLUSTERED 
(
    ImageID ASC,
    DT_CRTE_DOC ASC
)

अब हम एक मुद्दा रहा है, जहां BULK INSERTSSIS के माध्यम से अविश्वसनीय रूप से धीमी गति से चल रहा है। एक लाख पंक्तियाँ डालने में 1 घंटा। तालिका को पॉप्युलेट करने वाली क्वेरी पहले से ही सॉर्ट की गई है और पॉप्युलेट करने के लिए क्वेरी को चलाने में एक मिनट से अधिक समय लगता है।

जब प्रक्रिया चल रही होती है तो मैं BULK इंसर्ट पर प्रतीक्षा करने वाली क्वेरी देख सकता हूं जो 5 से 20 सेकंड तक कहीं भी होती है और एक प्रतीक्षा प्रकार दिखाती है PAGEIOLATCH_EX। प्रक्रिया केवल INSERTएक समय में लगभग एक हजार पंक्तियों में सक्षम है ।

कल जब मैं अपने UAT पर्यावरण के खिलाफ इस प्रक्रिया का परीक्षण कर रहा था उसी मुद्दे पर चल रहा था। मैं इस प्रक्रिया को कुछ बार चला रहा था और यह निर्धारित करने का प्रयास कर रहा था कि इस धीमे डालने का मूल कारण क्या है। फिर अचानक यह सब 5 मिनट के भीतर चलने लगा। इसलिए मैंने इसे उसी परिणाम के साथ कुछ और बार चलाया। इसके अलावा थोक आवेषण की संख्या जो 5 सेकंड या अधिक से अधिक गिराए गए फार्म का इंतजार कर रहे थे, लगभग 4।

अब यह चिंताजनक है क्योंकि ऐसा नहीं है कि हमारे पास गतिविधि में कुछ भारी गिरावट थी।

अवधि के दौरान सीपीयू कम है।

सी पी यू

कई बार जब यह धीमा होता है तो डिस्क पर कम इंतजार होता है।

वेट्स

डिस्क विलंबता वास्तव में उस समय सीमा के दौरान बढ़ जाती है जब प्रक्रिया 5 मिनट के भीतर चल रही थी।

विलंब

और आईओ उस समय के दौरान बहुत कम था कि यह प्रक्रिया खराब रूप से चलती है।

आईओ

मैंने पहले ही जाँच कर ली है और कोई फ़ाइल वृद्धि नहीं हुई क्योंकि फाइलें केवल 70% भरी हुई हैं। लॉग फ़ाइल अभी भी 50% जाने के लिए है। DB सरल रिकवरी मोड पर है। DB में केवल एक फ़ाइल समूह होता है, लेकिन यह 4 फ़ाइलों में फैला होता है।

तो मैं क्या सोच रहा हूं A: मैं उन थोक आवेषण पर इतने बड़े प्रतीक्षा समय क्यों देख रहा था। B: किस तरह का जादू हुआ जिसने इसे तेजी से चलाया?

पक्षीय लेख। यह आज फिर से बकवास की तरह चलता है।

अद्यतन यह वर्तमान में विभाजित है। हालांकि यह एक ऐसी विधि में किया जाता है जो सबसे अच्छा मूर्खतापूर्ण है।

CREATE PARTITION SCHEME [ps_Image] AS PARTITION [pf_Image] 
TO ([FG_Image], [FG_Image], [FG_Image], [FG_Image])

CREATE PARTITION FUNCTION [pf_Image](datetime) AS 
RANGE RIGHT FOR VALUES (
      N'2011-12-01T00:00:00.000'
    , N'2013-04-01T00:00:00.000'
    , N'2013-07-01T00:00:00.000'
);

यह 4 डी विभाजन में अनिवार्य रूप से सभी डेटा को छोड़ देता है। हालाँकि चूंकि यह सब एक ही फाइल ग्रुप में जा रहा है। वर्तमान में डेटा उन फ़ाइलों में समान रूप से विभाजित है।

अद्यतन 2 ये समग्र प्रतीक्षा कर रहे हैं जब प्रक्रिया खराब चल रही है।

प्रतीक्षा १

इस अवधि के दौरान यह इंतजार है कि मैं इस प्रक्रिया को चलाने में सक्षम था अच्छी तरह से चल रहा है।

Wait2

भंडारण उपतंत्र स्थानीय रूप से संलग्न है RAID, नहीं SAN शामिल। लॉग एक अलग ड्राइव पर हैं। RAID नियंत्रक 1 जीबी कैश आकार के साथ PERC H800 है। (यूएटी के लिए) उत्पाद एक पीईआरसी (810) है।

हम बिना बैकअप वाले साधारण रिकवरी का उपयोग कर रहे हैं। इसे रात को प्रोडक्शन कॉपी से बहाल किया जाता है।

हमने IsSorted property = TRUESSIS में भी सेट किया है क्योंकि डेटा पहले से ही सॉर्ट है।


ASYNC_NETWORK_IOइसका मतलब है कि SQL सर्वर किसी क्लाइंट को पंक्तियाँ भेजने का इंतज़ार कर रहा था । मुझे लगता है कि मंचन तालिका से पंक्तियों की खपत वाली SSIS की गतिविधि दिखाई दे रही है।
मैक्स वर्नोन

PAGEIOLATCH_EXऔर ASYNC_IO_COMPLETIONसंकेत कर रहे हैं कि यह डिस्क से मेमोरी में डेटा प्राप्त करने में कुछ समय ले रहा है। यह डिस्क सबसिस्टम के साथ एक समस्या का एक संकेतक हो सकता है, या यह स्मृति विवाद हो सकता है। SQL Server में कितनी मेमोरी उपलब्ध है?
मैक्स वर्नोन

ImageData की एक तालिका नाम के साथ, आपने मुझे उत्सुक किया है - वास्तविक तालिका परिभाषा क्या है? यदि आप LOB डेटा खींच रहे हैं, तो आप डिस्क पर जा रहे हैं (जो BLOBTempStoragePath पर जाता है जो कि अपरिभाषित होने पर उपयोगकर्ता की% TEMP% निर्देशिका aka C ड्राइव को निष्पादित करेगा)
बिलिंक

तालिका परिभाषा पोस्ट नहीं कर सकते हैं, लेकिन यह एक बाहर के दस्तावेज की जानकारी है।
ज़ेन

मुझे संदेह है कि यह समानांतर प्रसंस्करण मुद्दा है। मैं आपको अपने MAXDOP (1 से 4 से शुरू) को ट्यून करने और यह देखने के लिए सलाह दूंगा कि सब कुछ कैसे चलता है। दूसरी ओर, परीक्षण के उद्देश्य के लिए, मैं एसएससीआईएस को बदलने के लिए एक बीसीपी कमांड बनाऊंगा और देखूंगा कि क्या कोई अंतर है।
23

जवाबों:


1

मैं कारण को इंगित नहीं कर सकता, लेकिन मेरा मानना ​​है कि BULK INSERT ऑपरेशन के लिए डिफ़ॉल्ट पंक्तियों-प्रति-बैच "सभी" है। पंक्तियों में एक सीमा निर्धारित करने से ऑपरेशन अधिक सुगम हो सकता है: इसीलिए यह एक विकल्प है। (यहाँ और चल रहा है, मैं Transact-SQL "BULK INSERT" दस्तावेज को देख रहा हूँ, इसलिए यह SSIS के लिए रास्ता बंद कर सकता है।)

यह एक्स पंक्तियों के कई बैचों में ऑपरेशन को विभाजित करने का प्रभाव होगा, प्रत्येक एक अलग लेनदेन के रूप में काम करेगा। यदि कोई त्रुटि है, तो समाप्त होने वाले बैच गंतव्य तालिका में प्रतिबद्ध रहेंगे, और जिस बैच को रोक दिया गया था वह रोलबैक होगा। यदि आप जो कर रहे हैं, उसमें यह सहन करने योग्य है, यानी आप इसे बाद में फिर से चला सकते हैं और पकड़ सकते हैं, तो कोशिश करें।

यह एक विभाजन फ़ंक्शन के लिए गलत नहीं है जो सभी वर्तमान आवेषणों को एक तालिका विभाजन में रखता है, लेकिन मैं यह नहीं देखता कि यह एक ही फाइलग्रुप में विभाजन के साथ विभाजन के लिए कैसे उपयोगी है। और डेटाइम का उपयोग करना खराब है, और वास्तव में डेटाइम और 'YYYY-MM-DD' के लिए टूटा हुआ है, बिना किसी स्पष्ट फॉर्मूला के SQL Server 2008 के बाद से (SQL इसे हंसमुख रूप से YYYY-DD-MM के रूप में व्यवहार कर सकता है: मजाक नहीं कर रहा है: घबराओ मत, बस इसे 'YYYYMMDD', फिक्स्ड: या CONVERT (डेटाटाइम, 'YYYY-MM-DDT00: 00: 00', 126) में बदल दें, मुझे लगता है कि यह है)। लेकिन मुझे लगता है कि विभाजन के लिए डेट वैल्यू (वर्ष के रूप में इंट, या वर्ष + तिमाही) के लिए प्रॉक्सी का उपयोग करना बेहतर होगा।

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

यह एक डिजाइन की तरह लगता है जहां भविष्य में कुछ समय विभाजन 1 की सामग्री को छोड़ने और अधिक नए डेटा के लिए एक और नया विभाजन बनाने की योजना है, लेकिन यह ऐसा नहीं लगता है जैसा कि यहां हो रहा है। 2013 के बाद से कम से कम ऐसा नहीं हुआ है।


0

मैंने इस अवसर पर खुद को बड़े विभाजन वाले तालिकाओं में आवेषण पर इसी छिटपुट चरम मंदी को देखा है। क्या आपने गंतव्य तालिकाओं को अपडेट करने और फिर से चलने की कोशिश की है? चरम प्रतीक्षा समय खराब आँकड़ों के कारण हो सकता है, और यदि आपके परीक्षण के दौरान किसी बिंदु पर एक स्टेटस अपडेट ट्रिगर किया गया था, तो यह गति में वृद्धि को स्पष्ट करेगा। बस एक विचार और सत्यापित करने के लिए एक आसान परीक्षण।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.