मुझे एक तालिका में 100 मिलियन रिकॉर्ड अपडेट करने की आवश्यकता है, प्रभाव में, केवल एक आईडी के साथ एक कॉलम के वर्चर मान को बदलकर तालिका को सामान्य करना। (मैं कहता हूं "प्रतिस्थापित करना" लेकिन वास्तव में मैं आईडी को दूसरे कॉलम में लिख रहा हूं।)
मैं जो हासिल करने की कोशिश कर रहा हूं, वह डेटासेट को सामान्य बनाने के लिए है। अभी तक सामान्यीकृत डेटा में कोई अनुक्रमण नहीं है। मेरा विचार था कि मैं उन विदेशी मूल्यों को अनुक्रमित करने के बजाय कच्चे मूल्यों पर अनुक्रमणिका का निर्माण नहीं करूंगा, जो अद्यतन पूरा होने के बाद छोटे मूल्यों के साथ चर मानों की जगह ले लेंगे।
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
पृष्ठभूमि
- सर्वर 2008 R2 पर MSSQL 2008 R2 का उपयोग करना
- सर्वर में 8 जीबी रैम है
- सर्वर में एक RAID10, 7200 RPM SATA है (महान नहीं, मुझे पता है, उत्पादन में यह केवल डेटा पढ़ेगा और डेटा नहीं लिखेगा; हाल ही में एचडी की कमी ने लागत के लिए यह आवश्यक बना दिया है)
- सर्वर में डुअल क्वाड-कोर Xeon CPU है
- मशीन कुछ और नहीं कर रही है (वर्तमान में देव को समर्पित है, केवल यह प्रक्रिया)
- सरल लॉगिंग चालू हुई (-? लेकिन क्या यह अभी भी लॉग करता है ताकि यह रोलबैक हो सके?)
- ध्यान दें कि क्वेरी दो अलग-अलग DB का संदर्भ देती है, जो कि इसके लायक है
- अद्यतन की जा रही तालिका में रिकॉर्ड की "चौड़ाई" 455 बाइट्स है
निष्पादन के दौरान संसाधन
- भौतिक रैम अधिकतम है
- डिस्क I / O को अधिकतम किया जाता है
- सीपीयू शायद ही कुछ कर रहा है (चोक पॉइंट आई / ओ है)
- रन टाइम 14 घंटे और गिनती है!
मुझे कुछ चीजों पर संदेह है जैसे मुझे कच्चे डेटा पर एक सूचकांक की आवश्यकता है, भले ही मैं सामान्यीकरण अपडेट के बाद कॉलम (ऑटोकैस्नाम) को छोड़ दूंगा। मुझे यह भी आश्चर्य है कि अगर मुझे जोइन के बजाय यह शुरू करने में हास्यास्पद लग रहा था, तो मुझे टेबल वन रिकॉर्ड को एक बार में लूप कर देना चाहिए, लेकिन अब ऐसा लगता है कि यह तेजी से हुआ है।
मुझे अपने शेष सामान्यीकरण अपडेट (इस के समान) के लिए अपनी कार्यप्रणाली को और अधिक तेज़ी से कैसे बदलना चाहिए?
TOP
खंड के उपयोग से बैच अपडेट से मैं सहमत हूं । यही मेरा दृष्टिकोण होगा।