2010-10-26 14 views
6

पहले मुझे बताएं कि मैं SQL सर्वर 2005 पर चल रहा हूं इसलिए मेरे पास MERGE तक पहुंच नहीं है।सभी/थोक सम्मिलित करें

मेरे पास ~ 150k पंक्तियों वाली एक तालिका है जिसे मैं प्रतिदिन टेक्स्ट फ़ाइल से अपडेट कर रहा हूं। जैसे-जैसे टेक्स्ट फ़ाइल से पंक्तियां निकलती हैं, मुझे उन्हें डेटाबेस से हटाना होगा और यदि वे बदलते हैं या नए हैं तो मुझे तदनुसार अपडेट/डालने की आवश्यकता है।

कुछ परीक्षणों के बाद मुझे लगता है कि प्रदर्शन के अनुसार यह पूर्ण हटाने के लिए तेजी से तेज़ है और फिर फ़ाइल फ़ाइल से अद्यतन/डालने के लिए फ़ाइल लाइन के माध्यम से पढ़ने के बजाय टेक्स्ट फ़ाइल से थोक सम्मिलित है। हालांकि मैं हाल ही में एक टेम्पलेट तालिका का उपयोग कर MERGE कार्यक्षमता SQL Server 2008 की कार्यक्षमता और UPDATE कथन के आउटपुट की नकल करने पर चर्चा करने वाली कुछ पोस्टों में आया हूं।

मुझे इसमें रूचि थी क्योंकि मुझे लगता है कि तालिका में कोई पंक्ति नहीं होने पर मैं अपने हटाएं/थोक सम्मिलन विधि में समय को कैसे समाप्त कर सकता हूं। मुझे अभी भी लगता है कि यह विधि सबसे तेज़ होगी इसलिए मैं खाली तालिका समस्या को हल करने का सबसे अच्छा तरीका ढूंढ रहा हूं।

धन्यवाद

उत्तर

5

मुझे लगता है कि अपने सबसे तेजी से विधि के लिए होगा:

  1. ड्रॉप सभी विदेशी कुंजी और अनुक्रमित अपनी मेज से।
  2. Truncate आपकी तालिका।
  3. थोक अपना डेटा डालें।
  4. अपनी विदेशी कुंजी और अनुक्रमणिका को मनोरंजन करें।
+0

युक्तियों के लिए धन्यवाद, मुझे ट्रंकेट के बारे में पता नहीं था और संभवतः इसका उपयोग करेंगे, लेकिन तालिका खाली होने पर हटाने और थोक सम्मिलन के बीच छोटी अवधि की अवधि को खत्म करने की कोशिश कर रहा हूं। कोई विचार? – rpf3

+0

@ आरपीएफ 3: ट्रंकेट को आज़माएं। मुझे लगता है कि आप जिस देरी के बारे में बात कर रहे हैं उसमें से अधिकांश को खत्म कर दिया जाएगा। –

+0

ट्रंकेट डिलीट से निश्चित रूप से तेज़ था लेकिन बल्क सम्मिलन के लिए अभी भी ~ 9 सेकंड लगते हैं। मुझे यह देखने के लिए कहा गया है कि डाउनटाइम की इस छोटी राशि को खत्म करने का कोई तरीका है क्योंकि अन्य प्रक्रिया रनटाइम के दौरान डेटाबेस को हिट कर सकती है। – rpf3

0

कच्चे गति के लिए, मैं तालिका में ~ 150K पंक्तियों के साथ लगता है, मैं सिर्फ तालिका ड्रॉप, खरोंच से इसे पुन: और फिर थोक लोड नए सिरे से (अनुक्रमित) के बिना चाहते हैं। एक बार थोक भार हो जाने के बाद, इंडेक्स बनाएं।

यह निश्चित रूप से मानता है कि समय खाली होने पर तालिका खाली है/अस्तित्व में नहीं है, यह स्वीकार्य है जो ऐसा लगता है जैसे यह मामला हो सकता है।

3

क्या समस्या है कि जो का समाधान पर्याप्त तेज़ नहीं है, या आपकी प्रक्रिया चलने पर लक्ष्य तालिका के विरुद्ध कोई गतिविधि नहीं हो सकती है? यदि आपको उपयोगकर्ताओं को अपनी लक्षित तालिका के विरुद्ध क्वेरी चलाने से रोकने की आवश्यकता है, तो आपको अपनी प्रक्रिया को लेनदेन ब्लॉक में रखना चाहिए।

begin tran; 

truncate table stage_table 

bulk insert stage_table 
from N'C:\datafile.txt' 

commit tran; 
+0

मैं ऐसा करने के बारे में सोच रहा था, लेकिन अगर आपके पास डेटाफाइल या प्रारूप फ़ाइल तक पहुंचने की अनुमति नहीं है तो एक त्रुटि फेंक दी जाती है जिसे SQL TRY/CATCH द्वारा पकड़ा नहीं जा सकता है और कोड को मध्य लेनदेन को रोक देगा, इसे छोड़कर छोड़ देगा। – rpf3

1

एक वैकल्पिक समाधान है जो नहीं होने के लिए आपकी आवश्यकता satsify होगा "नीचे समय: इस तरह, जब आपके TRUNCATE टेबल कार्यान्वित करता है, यह है कि लेनदेन की अवधि के लिए आयोजित किया जाएगा एक मेज ताला, इसलिए की तरह पैदा करेगा "तालिका के लिए आप अद्यतन कर रहे हैं।

ऐसा लगता है कि मूल रूप से आप फ़ाइल पढ़ रहे थे और एक समय में एक INSERT/UPDATE/हटाएं 1 पंक्ति कर रहे थे।उसके अलावा एक अधिक performant दृष्टिकोण, उस तालिका नीचे समाशोधन शामिल नहीं करता है इस प्रकार है:

1) थोक एक नया और अलग तालिका में फ़ाइल लोड (कोई अनुक्रमणिका)
2) तो यह
पर पी बनाने 3) इस नई (अस्थायी) तालिका से मूल तालिका को अद्यतन करने के लिए 3 कथन चलाएं:
नई तालिका में मौजूद पंक्तियों को हटाएं
मुख्य तालिका में अद्यतन पंक्तियां जहां मिलान पंक्ति है नई तालिका में
आईएनएसईआरटी नई तालिका से मुख्य तालिका में पंक्तियां जहां वे पहले से मौजूद नहीं हैं

यह पंक्ति-दर-पंक्ति संचालन से बेहतर प्रदर्शन करेगा और उम्मीद है कि आपकी समग्र आवश्यकताओं को

+0

धन्यवाद, मैं यह देखने के लिए कुछ परीक्षण चला रहा हूं कि मैं इसका उपयोग करना चाहता हूं या बस छोटे समय के लिए लॉक लेनदेन के अंदर थोक डालने को रोकता हूं। – rpf3

1

शून्य डाउनटाइम के साथ तालिका को अपडेट करने का एक तरीका है: तालिका में दो दिन का डेटा रखें, और पुरानी पंक्तियों को हटाएं नए लोड हो रहा है!

  1. उस दिनांक का प्रतिनिधित्व करने वाले डेटाडेट कॉलम को जोड़ें, जिसके लिए आपकी ~ 150 के पंक्तियां वैध हैं।
  2. "आज के" डेटाडेट के साथ एक-पंक्ति, एक-कॉलम तालिका बनाएं।
  3. दो तालिकाओं का एक दृश्य बनाएं जो डेटाडेट तालिका में पंक्ति से मेल खाने वाली पंक्तियों का चयन करता है। यदि आप चाहें तो इसे इंडेक्स करें। पाठक अब इस दृश्य को संदर्भित करेंगे, तालिका नहीं।
  4. थोक पंक्तियों को सम्मिलित करें। (आपको स्पष्ट रूप से प्रत्येक पंक्ति में डेटाडेट जोड़ने की आवश्यकता होगी।)
  5. डेटाडेट तालिका अपडेट करें। अद्यतन देखें तत्काल!
  6. अपने अवकाश पर कल की पंक्तियां हटाएं।

SELECT प्रदर्शन पीड़ित नहीं होगा; प्राथमिक कुंजी के साथ एक पंक्ति में 150,000 पंक्तियों में शामिल होने से 15 वर्ष से कम आयु के किसी भी सर्वर को कोई समस्या नहीं होनी चाहिए।

मैंने इस तकनीक का अक्सर उपयोग किया है, और sp_rename पर निर्भर प्रक्रियाओं के साथ भी संघर्ष किया है। स्कीमा को संशोधित करने वाली उत्पादन प्रक्रियाएं सिरदर्द हैं। मत करो।

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