जैसा कि आप जानते हैं, डेटाबेस व्यवस्थापक की मुख्य जिम्मेदारी SQL सर्वर के प्रदर्शन की निगरानी और निर्धारित समय में हस्तक्षेप करना है। आप बाजार में कई SQL सर्वर प्रदर्शन निगरानी उपकरण पा सकते हैं लेकिन कभी-कभी हमें प्रदर्शन समस्याओं के निदान और समस्या निवारण के लिए SQL सर्वर के प्रदर्शन के बारे में अतिरिक्त जानकारी की आवश्यकता होती है। इसलिए SQL सर्वर के बारे में मुद्दों को संभालने के लिए हमारे पास SQL सर्वर डायनामिक मैनेजमेंट व्यू के बारे में पर्याप्त जानकारी होनी चाहिए।
डायनेमिक मैनेजमेंट व्यू (DMV) एक अवधारणा है जो SQL सर्वर इंजन प्रदर्शन मेट्रिक्स को खोजने में हमारी मदद करती है। DMV को पहली बार SQL Server 2005 संस्करण में घोषित किया गया था और यह बाद में SQL सर्वर के सभी संस्करणों में जारी रहा। इस पोस्ट में, हम विशेष DMV के बारे में बात करेंगे जिसके डेटाबेस एडमिनिस्ट्रेटर के पास पर्याप्त जानकारी होनी चाहिए। यह sys.dm_os_wait_stats . है ।
sys.dm_os_wait_stats
sys.dm_os_wait_stats SQL सर्वर प्रदर्शन समस्याओं के निदान के लिए आवश्यक मेट्रिक्स का समर्थन करता है। यदि आपके पास SQL सर्वर इंजन में कुछ समस्याएं (CPU, मेमोरी, I/O, Lock, Latch आदि) हैं, तो sys.dm_os_wait_stats डेटा समस्या को परिभाषित करने के लिए हमारा मार्गदर्शन करता है। SQL सर्वर प्रबंधन स्टूडियो में गतिविधि मॉनिटर में "संसाधन प्रतीक्षा करता है . नामक एक पैनल शामिल है " "संसाधन प्रतीक्षा" इन मीट्रिक को एक विशेष संग्रहीत प्रक्रिया से प्राप्त करता है। इस अस्थायी संग्रहीत कार्यविधि का नाम है “#am_generate_waitstats ” और यह sys.dm_os_wait_stats का उपयोग करता है। आप इस अस्थायी संग्रहीत कार्यविधि को "tempdb" में पा सकते हैं। इस बिंदु पर, मैं अस्थायी संग्रहीत कार्यविधि के बारे में कुछ नोट्स जोड़ना चाहूंगा। क्योंकि इस प्रकार की संग्रहीत कार्यविधि का सामान्य उपयोग नहीं होता है।
अस्थायी रूप से संग्रहीत कार्यविधि स्थायी संग्रहीत प्रक्रियाओं से अलग नहीं है। इसके दो प्रकार हैं:स्थानीय और वैश्विक जैसे अस्थायी टेबल। स्थानीय संग्रहीत कार्यविधि वर्तमान सत्र में सक्रिय रहती है और सत्र बंद होने के बाद हटा दी जाती है। इसे इस तरह बनाया जा सकता है:
CREATE PROCEDURE #LocalTestSP AS PRINT Hello Local Stored Procedure
वैश्विक संग्रहीत कार्यविधि भी सभी सत्रों में सक्रिय रहती है और बनाए गए सत्र के बंद होने के बाद छोड़ दी जाती है। वैश्विक संग्रहीत कार्यविधि इस प्रकार बनाई जा सकती है:
CREATE PROCEDURE ##GlobalTestSP AS PRINT Hello Global Stored Procedure
युक्ति: जब हम गतिविधि मॉनिटर खोलते हैं, तो यह #am_generate_waitstats बनाता है अस्थायी संग्रहीत प्रक्रिया और समापन के बाद इसे छोड़ देता है।
अब हम sys.dm_os_wait_stats के मुख्य विचार और विवरण पर गौर करेंगे . नीचे दी गई क्वेरी SQL सर्वर "प्रतीक्षा सांख्यिकी" के बारे में सभी डेटा लौटाएगी। यह क्वेरी शुद्धतम रूप में है। इस तरह के फॉर्म के साथ मुद्दों का पता लगाना असुविधाजनक है। निम्नलिखित अनुभागों में, आपको sys.dm_os_wait_stats के बाद और अधिक उपयोगी प्रश्न मिलेंगे। अब हम SQL सर्वर "वेट स्टैटिस्टिक्स" कॉलम के विवरण की व्याख्या करेंगे:
SELECT * FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC
प्रतीक्षा_प्रकार स्तंभ प्रतीक्षा आँकड़ों की परिभाषा या नाम शामिल है। प्रतीक्षा_टाइप कॉलम डेटा हमारे लिए महत्वपूर्ण है क्योंकि प्रतीक्षा आंकड़ों की परिभाषा जो समस्या का मुख्य कारण इंगित करती है। Wait_tasks_count SQL सर्वर में प्रतीक्षा प्रकार की आवृत्ति को इंगित करता है।
wait_time_ms कुल प्रतीक्षा समय को इंगित करता है। माप की इकाई मिलीसेकंड होती है।
max_wait_time_ms अधिकतम प्रतीक्षा समय इंगित करता है।
सिग्नल_वेट_टाइम_एमएस MSDN में "प्रतीक्षा थ्रेड के संकेत देने के समय और उसके चलने के समय के बीच अंतर" के रूप में वर्णित किया गया है। विशेष रूप से इस कॉलम का उच्च मूल्य CPU दबाव को दर्शाता है। तो क्वेरी चलने योग्य कतार में प्रतीक्षा कर रही है और चलने के लिए तैयार है लेकिन सीपीयू अन्य प्रश्नों में व्यस्त है। इस कारण से, क्वेरी कतार में प्रतीक्षा कर रही है। सीपीयू संसाधन उपलब्ध होने पर, सीपीयू को रननेबल क्यू से एक नई क्वेरी मिलेगी और प्रोसेसिंग शुरू हो जाएगी। संक्षेप में, हम signal_wait_time_ms . का वर्णन कर सकते हैं चलने योग्य कतार में प्रतीक्षा समय के रूप में जो चलने के लिए राज्य की बारी है।
युक्ति: सर्वोत्तम अभ्यास में, कई प्रतीक्षा आँकड़े अन्य की तुलना में सबसे महत्वपूर्ण हैं। इन्हें इस प्रकार सूचीबद्ध किया जा सकता है:
• PAGEIOLATCH_*
• लेखन
• ASYNC_NETWORK_IO
• सीएक्सपैकेट
• सीपीयू
• LCK_M_*
• प्रीमप्टिव_*
• PAGELATCH_*
सांख्यिकी प्रश्नों के लिए पिनाल डेव या पॉल एस. रैंडल प्रतीक्षा पर एक नज़र डालें। उन्होंने अपने प्रश्नों में कई प्रतीक्षा आँकड़ों को समाप्त कर दिया। नीचे दिए गए संसाधन प्रतीक्षा प्रकारों को sys.dm_os_wait_stats . में समाप्त किया जा सकता है प्रश्न:
• BROKER_EVENTHANDLER
• BROKER_RECEIVE_WAITFOR
• BROKER_TASK_STOP
• BROKER_TO_FLUSH
• BROKER_TRANSMITTER
• CHECKPOINT_QUEUE
•MAN_EVKPT
• ALCHKPT
• ALCHKPT
• CLR_SEMAPHORE
• DBMIRROR_DBM_EVENT
• DBMIRROR_DBM_MUTEX
• DBMIRROR_EVENTS_QUEUE
• DBMIRROR_WORKER_QUEUE
• DBMIRRORING_CMD
• FSAGENT
• FT_IFTS_SCHEDULER_IDLE_WAIT
• FT_IFTSHC_MUTEX
• HADR_CLUSAPI_CALL
• HADR_FILESTREAM_IOMGR_IOCOMPLET_HADR_FILESTREAM_IOMGR_IOCOMPLET_HADR_FILESTREAM_IOMGR_IOCOMPLET_HADR_WANTULESTREAM_IOMGR_IOCOMPLET_ / WANUEGTULESTREAM / • HADR_TIMER_TASK
• HADR_WORK_QUEUE
• LAZYWRITER_SLEEP
• LOGMGR_QUEUE
• MEMORY_ALLOCATION_EXT
• ONDEMANAND_TASK_QUEUE
• DRIVERIEMAND_TASK_QUEUE
• PREEMPTIVE_OS_COMOPS
• PREEMPTIVE_OS_CREATEFILE
• PREEMPTIVE_OS_CRYPTOPS
• प्रीम Ptive_os_deviceops
• Preemptive_os_fileops
br />• PREEMPTIVE_SP_SERVER_DIAGNOSTICS
• PREEMPTIVE_XE_GETTARGETSTATE
• PWAIT_ALL_COMPONENTS_INITIALIZED
• PWAIT_DIRECTLOGCONSUMER_GETNEXT
• QDS_ASYNC_QUEUE
• QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP
• QDS_PERSIST_TASK_MAIN_LOOP_SLEEP
• QDS_SHUTDOWN_QUEUE
• REDO_THREAD_PENDING_WORK
• REQUEST_FOR_DEADLOCK_SEARCH
• RESOURCE_QUEUE
• SERVER_IDLE_CHECK
• SLEEP_BPOOL_FLUSH
• SLEEP_DBSTARTUP
• SLEEP_DBSTARTUP
• SLEEP_MASTERUPGRADED
• SLEEP_MSDBSTARTUP
• SLEEP_SYSTEMTASK
• SLEEP_TASK
• SP_SERVER_DIAGNOSTICS_SLEEP
• SQLTRACE_BUFFER
• SQLTRACE_BUFFER _INCREMENTAL_FLUSH_SLEEP
• SQLTRACE_WAIT_ENTRIES
• UCS_SESSION_REGISTRATIO
• WAIT_FOR_RESULTS
• WAIT_XTP_CKPT_CLOSE
• /
• XE_TIMER_EVENT
• XE_DISPATCHER_WAIT
• XE_LIVE_TARGET_TVF
युक्ति: SQL सर्वर प्रारंभ या पुनरारंभ होने पर DMV डेटा एकत्र करना प्रारंभ करता है। SQL सर्वर के पुनरारंभ होने पर स्वचालित रूप से प्रतीक्षा आँकड़ों को रीसेट कर देता है और नीचे दी गई क्वेरी SQL सर्वर के अंतिम बार पुनरारंभ होने के बाद से प्रतीक्षा आंकड़ों को रीसेट करने के लिए बाध्य करती है:
DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR)
इसके अतिरिक्त, प्रतीक्षा आँकड़ों की माप सटीकता प्रमुख बिंदु है। इस बिंदु पर हम दो दृष्टिकोणों पर विचार कर सकते हैं:
• प्रतीक्षा आँकड़े रीसेट करें और प्रतीक्षा आँकड़े याद रखें।
• दो अलग-अलग "समय प्रतीक्षा आंकड़े" कैप्चर करें और मूल्यों में अंतर को मापें।
मेरी राय में, किसी भी इतिहास तालिका दृष्टिकोण के लिए प्रतीक्षा आंकड़ों को कैप्चर करना और संग्रहीत करना अन्य की तुलना में बेहतर है। इस पद्धति में, आप विशेष रूप से समय अंतराल को माप सकते हैं और ऐतिहासिक डेटा के प्रतीक्षा आंकड़े नहीं खो सकते हैं।
अब हम प्रतीक्षा आंकड़ों के कैप्चरिंग का एक नमूना बनाएंगे और पावर बीआई में ग्राफिक्स के साथ कैप्चर किए गए डेटा को दिखाएंगे।
हम प्रतीक्षा आँकड़ों को संग्रहीत करने के लिए एक इतिहास तालिका बनाएंगे:
CREATE TABLE [dbo].[HistoryOfWaitStatistics]( [SQLStartTime] [datetime] NULL, [Dt] [datetime] NOT NULL, [WaitType] [nvarchar](60) NOT NULL, [WaitTimeSecond] [numeric](25, 6) NULL, [ResourcesWaitSecond] [numeric](25, 6) NULL, [SignalWaitSecond] [numeric](25, 6) NULL ) ON [PRIMARY]
नीचे दी गई स्क्रिप्ट इतिहास तालिका में "आंकड़ों की प्रतीक्षा करें" सम्मिलित करती है। लेकिन आपको इस क्वेरी को SQL सर्वर एजेंट में शेड्यूल करने की आवश्यकता है इतिहास तालिका संग्रहीत करने के लिए:
DROP TABLE IF exists #eliminate_WS CREATE TABLE #eliminate_WS (wait_type NVARCHAR(100)); INSERT INTO #eliminate_WS VALUES ('ASYNC_IO_COMPLETION'); INSERT INTO #eliminate_WS VALUES ('CHECKPOINT_QUEUE'); INSERT INTO #eliminate_WS VALUES ('CHKPT'); INSERT INTO #eliminate_WS VALUES ('CXPACKET'); INSERT INTO #eliminate_WS VALUES ('DISKIO_SUSPEND'); INSERT INTO #eliminate_WS VALUES ('FT_IFTS_SCHEDULER_IDLE_WAIT'); INSERT INTO #eliminate_WS VALUES ('IO_COMPLETION'); INSERT INTO #eliminate_WS VALUES ('KSOURCE_WAKEUP'); INSERT INTO #eliminate_WS VALUES ('LAZYWRITER_SLEEP'); INSERT INTO #eliminate_WS VALUES ('LOGBUFFER'); INSERT INTO #eliminate_WS VALUES ('LOGMGR_QUEUE'); INSERT INTO #eliminate_WS VALUES ('MISCELLANEOUS'); INSERT INTO #eliminate_WS VALUES ('PREEMPTIVE_XXX'); INSERT INTO #eliminate_WS VALUES ('REQUEST_FOR_DEADLOCK_SEARCH'); INSERT INTO #eliminate_WS VALUES ('RESOURCE_QUERY_SEMAPHORE_COMPILE'); INSERT INTO #eliminate_WS VALUES ('RESOURCE_SEMAPHORE'); INSERT INTO #eliminate_WS VALUES ('SOS_SCHEDULER_YIELD'); INSERT INTO #eliminate_WS VALUES ('SQLTRACE_BUFFER_FLUSH '); INSERT INTO #eliminate_WS VALUES ('THREADPOOL'); INSERT INTO #eliminate_WS VALUES ('WRITELOG'); INSERT INTO #eliminate_WS VALUES ('XE_DISPATCHER_WAIT'); INSERT INTO #eliminate_WS VALUES ('XE_TIMER_EVENT'); INSERT INTO HistoryOfWaitStatistics SELECT (SELECT sqlserver_start_time FROM sys.dm_os_sys_info ) as SQLStartTime,GETDATE() AS Dt,Wait_type as WaitType, wait_time_ms / 1000. AS WaitTimeSecond, (wait_time_ms - signal_wait_time_ms)/1000. AS ResourcesWaitSecond, signal_wait_time_ms/1000. AS SignalWaitSecond FROM sys.dm_os_wait_stats WHERE wait_type IN(SELECT wait_type FROM #eliminate_WS)
ऐतिहासिक डेटा संग्रहीत होने के बाद, हम Power BI खोलते हैं और अपना प्रतीक्षा आँकड़े डैशबोर्ड विकसित करते हैं।
डेटा प्राप्त करें क्लिक करें और एसक्यूएल सर्वर चुनें :
कनेक्शन सेटिंग सेट करें और फिर क्वेरी को SQL कथन (वैकल्पिक, डेटाबेस की आवश्यकता है) में लिखें . ठीकक्लिक करें ।
मार्केटप्लेस से आयात करें Click क्लिक करें
OKViz द्वारा स्पार्कलाइन ढूंढें दृश्य घटक और जोड़ें पावर बीआई
Power BI डिज़ाइन पैनल में स्पार्कलाइन जोड़ें और नीचे दी गई छवि के अनुसार डेटासेट कॉलम खींचें और छोड़ें:
फ़िल्टर करने के लिए दो तालिका घटक जोड़ें:SQLStartTime और प्रतीक्षा प्रकार . अंत में, डैशबोर्ड इस तरह होना चाहिए:
संसाधन प्रतीक्षा समस्या का निदान कैसे करें:
इस खंड में, हम प्रतीक्षा सांख्यिकी समस्याओं के निदान की पद्धति और अनुशासन का उल्लेख करेंगे। विशेष रूप से, हमें प्रतीक्षा आँकड़ों के बारे में एक बिंदु का पता लगाना होगा:यह केवल समस्या की मुख्य संरचना को परिभाषित करता है लेकिन कभी विवरण नहीं देता है। इस कारण से, हमें प्रतीक्षा विवरण और कारणों पर शोध करने की आवश्यकता है। इसलिए, "प्रतीक्षा आँकड़े" हमें अपने शोध को इस दिशा में बदलने की अनुमति देता है। इसके बाद, हमें सटीक समस्याओं को परिभाषित करने के लिए अन्य टूल (PerfMon, Extended Events, 3rd पार्टी मॉनिटरिंग टूल, आदि) और अन्य DMV का उपयोग करना चाहिए।
यह मानते हुए कि, हम SQL सर्वर में ASYNC_NETWORK_IO का निरीक्षण करते हैं, यह संसाधन प्रतीक्षा क्लाइंट से सर्वर की ओर धीमे नेटवर्क कनेक्शन से संबंधित है। लेकिन यह जानकारी समस्या के मुख्य कारण का निवारण करने में मदद नहीं करती है क्योंकि हमारे पास सर्वर और क्लाइंट साइड के बीच कई नेटवर्क कॉन्फ़िगरेशन हो सकते हैं। इस उदाहरण के लिए हमें देखने की जरूरत है:
• बड़े परिणाम क्वेरी सेट करते हैं
• नेटवर्क इंटरफेस कार्ड विन्यास
• सर्वर साइड से क्लाइंट साइड के बीच नेटवर्क वातावरण की सेटिंग।
• नेटवर्क एडेप्टर बैंडविड्थ की जाँच करें।
जैसा कि आप उदाहरण में देख सकते हैं, हमें सटीक समस्या को परिभाषित करने के लिए कुछ कार्यों को पूरा करने की आवश्यकता है। प्रतीक्षा आँकड़े समस्या के लक्ष्य को नहीं दर्शाते हैं।
निष्कर्ष
इस पोस्ट में, हमने sys.dm_os_wait_stats डायनामिक मैनेजमेंट व्यू की मुख्य अवधारणा के बारे में बात की। उसी समय, हमने उपयोग की सादगी और महत्वपूर्ण बिंदुओं पर चर्चा की, जिन पर ध्यान देना आवश्यक है।
उपयोगी टूल:
dbForge मॉनिटर - Microsoft SQL सर्वर प्रबंधन स्टूडियो के लिए ऐड-इन जो आपको SQL सर्वर के प्रदर्शन को ट्रैक और विश्लेषण करने की अनुमति देता है।