लोड के तहत प्रदर्शन बढ़ाता है: क्यों?


19

मेरे पास कोड का एक टुकड़ा है जो आवेषण को अत्यधिक असामान्य तालिकाओं में करता है। तालिकाओं में स्तंभों की संख्या ~ 100 से 300+ तक होती है। यह SQL Server 2008 R2 है, जो Windows Server 2008 पर चल रहा है।

प्रत्येक इंसर्ट में एक ही ट्रांजेक्शन के तहत कई टेबल्स सम्मिलित की जाती हैं। कुछ आवेषण NHibernate द्वारा बैच किए जाते हैं, लेकिन कुछ नहीं हो सकते हैं, लेकिन वे सभी समान लेनदेन के तहत हैं।

जब मैं बार-बार कोड डालने वाले कोड को कॉल करके 500 बार कहने के लिए आवेषण करता हूं, तो मुझे औसतन ~ 360 एमएस मिलता है।

अजीब सा है, जब मैं एक साथ 4 प्रक्रियाओं (विंडोज़ सर्वर 2008 के तहत 4 अलग-अलग कमांड प्रॉम्प्ट से एक ही exe रन) का उपयोग करके परीक्षण कोड चलाता हूं, तो प्रति कॉल प्रविष्टि का प्रदर्शन बहुत बेहतर हो जाता है। मैं फटने को देखता हूं जो 90 एमएस के रूप में तेजी से जाता है (लगभग X4 तेज)। मैं कोड से प्रविष्टि समय को माप रहा हूं।

चूंकि 4 प्रक्रियाएं एक-दूसरे के बारे में कुछ नहीं जानती हैं, इसलिए मैं यह मान रहा हूं कि इसका SQL सर्वर के साथ कुछ लेना-देना है, लेकिन मेरे पास कोई सुराग नहीं है। मैं जानना चाहता हूं कि ऐसा क्यों हो रहा है और यदि कोई कॉन्फ़िगरेशन है जो मुझे आवेषण नहीं होने पर उसी प्रदर्शन को प्राप्त करने की अनुमति देगा।

डीबी स्तर पर क्या हो रहा है यह समझने के लिए SQL सर्वर निगरानी विधियों के बारे में सुझाव समान रूप से स्वागत करते हैं।

जवाबों:


15

एक संभावित कारण यह है कि चार समवर्ती प्रक्रियाएं लॉग फ्लश का अधिक अनुकूल पैटर्न उत्पन्न करती हैं - आमतौर पर इसका अर्थ है कि प्रत्येक लॉग फ्लश एक एकल निष्पादन प्रक्रिया के मामले में अधिक डेटा लिखता है।

यह निर्धारित करने के लिए कि लेन-देन लॉग थ्रूपुट / फ्लश आकार एक कारक है, मॉनिटर करें:

  • sysinos_os_wait_stats के लिए WRITELOGऔर LOGBUFFERइंतजार कर रहा है
  • IO प्रदर्शन के लिए sysinos_io_pending_io_requests
  • प्रदर्शन मॉनिटर काउंटर्स (या sysinos_os_performance_counters ) के लिए:
    • लॉग बाइट्स फ्लश / सेकंड
    • लॉग फ्लश / सेकंड
    • लॉग फ्लश प्रतीक्षा समय

आंतरिक सीमाओं तक पहुँचने के लिए देखें। SQL Server 2008 R2 में, 64-बिट संस्करणों (32 में से केवल 8 पर केवल 8) में अधिकतम 32 बकाया (अतुल्यकालिक) लॉग फ्लश I / Os हो सकते हैं। 3840KB के बकाया IOs पर कुल आकार सीमा भी है।

अधिक जानकारी और आगे पढ़ने:


12

सब कुछ @PaulWhite कहते हैं, प्लस ...

यदि आपके पास विदेशी चाबियां हैं, तो प्रत्येक प्रविष्टि को संदर्भित प्रत्येक टेबल पर एक चेक की आवश्यकता होगी। यह मुझे लगता है जैसे आप हैं, जैसा कि आप केवल 360ms हो रहे हैं, जो मुझे धीमा लगता है।

वैसे भी, उन तालिकाओं को जाँचने से उस डेटा को रैम में पहले से ही मदद मिलती है, बजाय इसे डिस्क में लोड करने के।

यह मुझे लगता है जैसे रैम में डेटा लोड करना आपके निष्पादन का एक महत्वपूर्ण हिस्सा है, और यह केवल एक बार होने की आवश्यकता है।

यह प्रभावी योजना कैशिंग भी हो सकती है, और यह कि आपके प्रश्नों को पहली बार संकलित करने की आवश्यकता है, बाद की कॉल उस चरण से बचने में सक्षम हैं।


धन्यवाद रॉब। मेरी प्रदर्शन समस्या एक सम्मिलित के दौरान उपयोग की जाने वाली तालिकाओं की उच्च संख्या से संबंधित है। कोई विदेशी कुंजी नहीं है, मैंने उन्हें प्रदर्शन कारणों से हटा दिया और मेरे मॉडल और डोमेन आवश्यकताओं ने मुझे ऐसा करने की अनुमति दी। मैं रैम को डेटा लोड नहीं कर रहा हूं, और मेरे आवेषण गतिशील रूप से आने वाले अनुरोधों द्वारा आकार में हैं, जो हर समय बदल रहे हैं। मैं मूल रूप से OLTP के लिए एक स्टार / स्नोफ्लेक (ish) स्कीमा का दुरुपयोग कर रहा हूं और मैं जो सबसे अच्छा प्रदर्शन कर सकता हूं उससे दूर होने की कोशिश कर रहा हूं।
महोना

2
@mahonya, भले ही आप रैम में डेटा को स्पष्ट रूप से लोड नहीं कर रहे हों, SQL सर्वर को सम्मिलित ऑपरेशन करने से पहले पहले आवश्यक सूचकांक और डेटा पेजों को बफर कैश में पढ़ना चाहिए। समवर्ती सम्मिलित थ्रेड्स में कैश को गर्म करने का प्रभाव हो सकता है जैसे कि एक धागा रीड ओवरहेड और दूसरा डेटा को कैश में एक्सेस करता है।
डैन गुज़मैन

धन्यवाद @DanGuzman - और हां, महोनिआ, एक मजबूत मौका है कि आपका कैश अच्छी तरह से गर्म हो रहा है। मैं यह देखने के लिए आपके इंतजार कर रहा हूं कि क्या यह शारीरिक I / O आपकी अड़चन का कारण है।
रोब फ़ार्ले

धन्यवाद @DanGuzman सहमत, डीबी इंडेक्स कैश स्पीडअप कुछ ऐसा है जिसका उपयोग मैं पोस्टग्रेज में देखने के लिए कर रहा हूं मैं शायद रॉब के इनपुट को गलत समझ रहा हूं।
महोना 14:22

-3

कुछ सर्वर / cpus / os का पैटर्न याद है। कैश की तरह।

जब से आप 4 बार एक ही काम कर रहे हैं, मुझे यकीन है कि ऐसे तरीके हैं जो इसे कोनों को काट सकते हैं, जो मैं अनुमान लगा रहा हूं कि आप इसे करने का पहला तरीका है, यह इसे एक लंबी प्रक्रिया के रूप में समझता है (उदाहरण 1) लेकिन दूसरे तरीके से पुन: उपयोग किए गए कोड को देखता है और इसे कैश (उदाहरण 2) की तरह चलाता है या यह पहली प्रक्रिया हो सकती है जो इसे (राम उदाहरण 3) में फिट करने के लिए बड़ी है।

example1: 01111100001101111100001110111110000000011110111110000

example2: 0111110000 | 11 | 0111110000 | 111 | 0111110000 | 11 | 0 | 0111110000 |

उदाहरण 3: 011111000001111100000111110000000011110000 उदाहरण 3: लूप: 0111110000

मुझे पता है कि ubuntu सर्वर बार-बार mysql प्रश्नों के साथ ऐसा करता है। मैं उन्हें कैश में बचा सकता हूं, हालांकि वास्तव में समय का एकमात्र अंतर 10-40mms है, लेकिन यह ऊपर जोड़ता है। जब मैं स्कूल में था तब कक्षाएं थीं, जिसमें दिखाया गया था कि आपको प्रोग्राम बनाने होंगे (पर्ल / php) उस कैश का उपयोग तेज करने के लिए।

लेकिन, यह कार्यक्रम पर निर्भर हो सकता है कि यह किस भाषा में है, इसे किस रूप में संकलित किया गया है या इसे कैसे प्रोग्राम किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.