हमारे पास एक उत्पाद के लिए एक डेटाबेस है जो लेखन-भारी है। हमने मदद करने के लिए SSD के साथ एक नया सर्वर मशीन खरीदा। हमारे आश्चर्य के लिए, हमारे धीमी मशीन के भंडारण के साथ सम्मिलन तेज नहीं थे। बेंचमार्किंग के दौरान हमने देखा कि SQL सर्वर प्रक्रिया द्वारा प्रदर्शित IO दर बहुत कम थी।
उदाहरण के लिए, मैंने इस पृष्ठ पर पाई गई स्क्रिप्ट को चलाया , इसके अलावा मैंने पाश के चारों ओर एक BEGIN TRAN और COMMIT जोड़ा। सबसे अच्छा मैं डिस्क का उपयोग 7Mb / s तक पहुंच सकता था, जबकि सीपीयू ने मुश्किल से 5% को छुआ था। सर्वर में 64Gb इंस्टॉल है और 10 का उपयोग कर रहा है। बाद के कॉल के लिए पहले कॉल डाउन करने में कुल रन समय 2 मिनट 15 सेकंड था। डेटाबेस सरल पुनर्प्राप्ति पर है और परीक्षण के दौरान निष्क्रिय था। मैंने प्रत्येक कॉल के बीच तालिका को गिरा दिया।
इतनी सरल स्क्रिप्ट इतनी धीमी क्यों है? हार्डवेयर का बमुश्किल उपयोग किया जा रहा है। समर्पित डिस्क बेंचमार्किंग टूल और एसक्यूआईओ दोनों संकेत देते हैं कि एसएसडी पढ़ने और लिखने दोनों के लिए 500Mb / s की गति के साथ सही ढंग से कार्य करता है। मैं समझता हूं कि यादृच्छिक लेखन क्रमिक लेखन की तुलना में धीमा है, लेकिन मैं इस तरह की सरल प्रविष्टि की उम्मीद करूंगा, बिना किसी अनुक्रमित तालिका के, बहुत तेज़ी से हो।
अंततः हमारा परिदृश्य बहुत अधिक जटिल है, लेकिन मुझे लगता है कि मुझे पहले एक साधारण मामले को समझने की आवश्यकता है। संक्षेप में हमारा एप्लिकेशन पुराने डेटा को हटा देता है, फिर SqlBulkopy का उपयोग करके स्टैगिंग टेबल पर नए डेटा की प्रतिलिपि बनाता है, कुछ फ़िल्टरिंग करता है, और अंत में डेटा को अंतिम तालिकाओं में कॉपी करने के लिए मामलों के आधार पर MERGE और / या INSERT INTO का उपयोग करता है।
-> EDIT 1: मैंने मार्टिन स्मिथ द्वारा लिंक की गई प्रक्रिया का पालन किया, और मुझे निम्नलिखित परिणाम मिले:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
मुझे यह अजीब लगता है कि NETWORK_IO को अधिकांश समय लगता है, यह प्रदर्शित करने के लिए कोई परिणाम नहीं है और SQL फ़ाइलों के अलावा कहीं भी स्थानांतरित करने के लिए कोई डेटा नहीं है। क्या NETWORK_IO प्रकार में सभी IO शामिल हैं?
-> EDIT 2: मैंने 20Gb RAM डिस्क बनाई और वहां से एक डेटाबेस माउंट किया। एसएसडी पर मेरे पास सबसे अच्छा समय 48 का है, रैम डिस्क के साथ यह 37 सेकंड तक नीचे चला गया। NETWORK_IO अभी भी सबसे बड़ी प्रतीक्षा है। रैम डिस्क में अधिकतम लिखने की गति लगभग 250Mb / s थी, जबकि यह प्रति सेकंड मल्टी गीगाबाइट करने में सक्षम है। यह अभी भी बहुत सीपीयू का उपयोग नहीं कर रहा था, इसलिए एसक्यूएल को क्या रखा गया है?
NETWORK_IO
3 लाख "1 पंक्ति (यों) प्रभावित" संदेशों को वापस भेजे जाने से हो सकता है। क्या आपने SET NOCOUNT ON
स्क्रिप्ट में जोड़ने की कोशिश की ?
EE_WaitStats*.xel
ताकि पुराने आपके परिणामों को दूषित करेंगे।
SET NOCOUNT ON
इसे भी जोड़ूंगा।