सबकुछ से मैं देख सकता हूं कि आपकी समस्याएं इंडेक्स से संबंधित नहीं हैं।
कुंजी तथ्य यह है कि अपने nvarchar (अधिकतम) क्षेत्र डेटा की "बहुत सारे" शामिल में हो रहा है। इस अद्यतन को करने के लिए एसक्यूएल को क्या करना है इसके बारे में सोचें।
के बाद से स्तंभ आप अद्यतन कर रहे हैं की संभावना 8000 से अधिक वर्ण यह ऑफ पेज है, जो इस कॉलम को पढ़ने जब यह शून्य नहीं है में अतिरिक्त प्रयास का तात्पर्य संग्रहीत होती है।
जब आप 50000 अपडेट एसक्यूएल आदेश यह संभव है किसी भी समस्याओं के मामले में वापस रोल करने के लिए एक अंतर्निहित लेनदेन में इस जगह के लिए है का एक बैच चलाते हैं। वापस रोल करने के लिए इसे लेनदेन लॉग में कॉलम के मूल मान को स्टोर करना होगा।
मानते हैं (सादगी के लिए) प्रत्येक स्तंभ में औसत 10,000 बाइट डेटा होते हैं, जिसका अर्थ है कि 50,000 पंक्तियों में लगभग 500 एमबी डेटा होगा, जिसे अस्थायी रूप से (सरल वसूली मोड में) या स्थायी रूप से संग्रहीत किया जाना चाहिए (पूरी तरह से पुनर्प्राप्ति में) मोड)।
वहाँ लॉग अक्षम करना के रूप में यह डेटाबेस अखंडता के साथ समझौता होगा कोई रास्ता नहीं है।
मैंने अपने कुत्ते के धीमे डेस्कटॉप पर एक त्वरित परीक्षण चलाया, और 10,000 तक चलने वाले बैच भी धीमे हो जाते हैं, लेकिन आकार को 1000 पंक्तियों तक लाया जाता है, जो लगभग 10 एमबी के अस्थायी लॉग आकार का तात्पर्य है, केवल अच्छी तरह से काम करता है।
मैंने 350,000 पंक्तियों वाली एक तालिका लोड की और अद्यतन के लिए उनमें से 50,000 चिह्नित किए। यह लगभग 4 मिनट में पूरा हुआ, और चूंकि यह रैखिक रूप से स्केल करता है, इसलिए आप अपने कुत्ते धीमे डेस्कटॉप पर अपने पूरे 5 मिलियन पंक्तियों को अपने 1 प्रोसेसर 2 जीबी डेस्कटॉप पर लगभग 6 घंटों में अपडेट करने में सक्षम होना चाहिए, इसलिए मैं आपके बीफ़ी सर्वर पर समर्थित कुछ बेहतर उम्मीद करूँगा SAN या कुछ द्वारा।
आप एक का चयन के रूप में अपने अद्यतन बयान चलाने केवल प्राथमिक कुंजी और बड़े nvarchar स्तंभ का चयन, और इस रूप में तेजी से आप उम्मीद के रूप में चलाता है सुनिश्चित करने के लिए कर सकते हैं।
बेशक बाधा अन्य उपयोगकर्ताओं को सर्वर पर आपके स्टोरेज या मेमोरी पर चीजों या विवाद को लॉक कर सकती है, लेकिन चूंकि आपने अन्य उपयोगकर्ताओं का उल्लेख नहीं किया है, इसलिए मुझे लगता है कि आपके पास एकल उपयोगकर्ता मोड में डीबी है।
एक अनुकूलन के रूप में आप यह सुनिश्चित करना चाहिए कि हस्तांतरण लॉग बार की तलाश को कम करने के डेटा से एक अलग भौतिक डिस्क/डिस्क समूह पर हैं।
यह भी देखें: http://stackoverflow.com/questions/571750/make-sql-server-faster-at-manipulating-data-turn-off-transaction-logging –
आप '50 के बैच रिकॉर्ड कैसे कर रहे हैं एक समय 'अद्यतन? क्या यह एक संग्रहीत प्रक्रिया के साथ है? यदि हां, तो क्या आप कोड डाल सकते हैं? – Fede
@ user356004: पुन: पढ़ने पर मैं यह सोचने में मदद नहीं कर सकता कि या तो आपका सर्वर भारी भार में है या यह ठीक से स्थापित नहीं है: वह समय बहुत अधिक प्रतीत होता है। –