मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे लगता है कि यह एक बहुत ही महत्वपूर्ण विषय है, खासकर आजकल जहां हमारे पास 10M + रिकॉर्ड हैं और डेटा के टेराबाइट्स के बारे में बात करते हैं।
मैं निम्नलिखित टिप्पणियों के साथ वजन भी करूंगा। मेरी तालिका ([डेटा]) में लगभग 45M रिकॉर्ड हैं, और मेरी [बिल्लियों] तालिका में लगभग 300 रिकॉर्ड हैं। मैं उन सभी प्रश्नों के लिए व्यापक अनुक्रमण कर रहा हूं जिनके बारे में मैं बात करने वाला हूं।
उदाहरण 1 पर विचार करें:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
बनाम उदाहरण 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
उदाहरण 1 को चलाने में लगभग 23 मिनट लगे। उदाहरण 2 में लगभग 5 मिनट लगे।
इसलिए मैं यह निष्कर्ष निकालूंगा कि इस मामले में उप-प्रश्न बहुत तेज है। बेशक यह ध्यान रखें कि मैं M.2 SSD ड्राइव का उपयोग कर रहा हूँ जो i / o @ 1GB / sec (thats बाइट्स बिट्स नहीं) में सक्षम है, इसलिए मेरे अनुक्रमित वास्तव में बहुत तेज़ हैं। तो यह आपकी परिस्थिति में गति को भी प्रभावित कर सकता है
यदि इसका एक-बंद डेटा क्लींजिंग है, तो संभवतः इसे चलाने और खत्म करने के लिए सबसे अच्छा है। मैं TOP (10000) का उपयोग करता हूं और देखता हूं कि बड़ी क्वेरी को हिट करने से पहले कितने समय लगते हैं और रिकॉर्ड की संख्या से गुणा करें।
यदि आप उत्पादन डेटाबेस का अनुकूलन कर रहे हैं, तो मैं दृढ़ता से पूर्व-प्रसंस्करण डेटा का सुझाव दूंगा, अर्थात ट्रिगर्स या जॉब-ब्रोकर को एएसक्यूएन अपडेट रिकॉर्ड्स का उपयोग करना, ताकि वास्तविक समय तक पहुंच स्थिर डेटा को पुनः प्राप्त कर सके।