Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

क्वेरी, संग्रहीत कार्यविधियों और ट्रिगर के लिए SQL सर्वर प्रदर्शन संकेतक को लागू करना

प्रस्तावना

जल्दी या बाद में, एक DB व्यवस्थापक SQL सर्वर प्रश्नों के लिए एक प्रदर्शन संकेतक रखना चाहेगा। जैसा कि हम सभी जानते हैं, 24 घंटे के लिए Profiler चलाने से काफी सिस्टम लोड होगा और इसलिए, इसे 24/7 मोड में उपयोग किए जाने वाले डेटाबेस के लिए एक इष्टतम समाधान नहीं माना जा सकता है।

तो, हम SQL सर्वर प्रश्नों की स्थिति का पता कैसे लगा सकते हैं? हम मानव इनपुट के बिना खोजी गई क्वेरी-संबंधी समस्याओं के लिए ट्रेस कैसे चला सकते हैं?

इस लेख में, मैं क्वेरी, संग्रहीत कार्यविधियों और ट्रिगर्स के लिए SQL सर्वर प्रदर्शन संकेतक का कार्यान्वयन, साथ ही ट्रेस रन के लिए इसका उपयोग प्रदान करूंगा।

समाधान

सबसे पहले, आइए प्रश्नों, संग्रहीत प्रक्रियाओं और ट्रिगर के लिए प्रदर्शन संकेतक के कार्यान्वयन के सामान्य दृष्टिकोण पर एक नज़र डालें:

  1. सूचना संग्रह और विश्लेषण के लिए आवश्यक तालिकाओं का निर्माण।
  2. सूचना संग्रह के लिए एक दृश्य का निर्माण।
  3. सूचना संग्रह के लिए संग्रहित प्रक्रियाओं का निर्माण।
  4. सूचना आउटपुट के लिए एक दृश्य का निर्माण।

और अब, कार्यान्वयन पर विचार करें:

1. सूचना संग्रह और विश्लेषण के लिए आवश्यक तालिकाओं का निर्माण।

1.1. प्रश्नों के लिए:

उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE तालिका [srv]। बाइनरी] (8) न्यूल, [एक्ज़ीक्यूशनकाउंट] [बिगिन्ट] न्यूल, [टोटलवर्करटाइम] [बिगिन्ट] न्यूल, [स्टेटमेंट टेक्स्ट] [नवरचर] (अधिकतम) न्यूल, [टोटलएलेप्सडटाइम] [बिगिन्ट] न्यूल, कॉन्स्ट्रेंट [पीके_एसक्यूएल_स्टेटमेंटएक्सेकस्टैट] प्राथमिक कुंजी क्लस्टर ( [आईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [PRIMARY]) ऑन [PRIMARY] 

1.2. संग्रहित प्रक्रियाओं के लिए:

 उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [SQL_ProcedureExecStat] ( [आईडी] [bigint] पहचान (1,1) शून्य नहीं, [सम्मिलित तिथि] [डेटाटाइम] शून्य, [डेटाबेस_आईडी] [डेटाबेस_आईडी] NULL, [object_id] [int] NULL, [ExecutionCount] [bigint] NULL, [TotalWorkerTime] [bigint] NULL, [TotalElapsedTime] [bigint] NULL, [TotalPhysicalReads] [bigint] NULL, [TotalLogicalReads] [bigint] NULL, [TotalLogicalWrites] [bigint] NULL, CONSTRAINT [PK_SQL_ProcedureExecStat] प्राथमिक कुंजी क्लस्टर ([ID] ASC) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, MARCKS) [ILOCKS =ALLOW_ONROW_ON प्राथमिक]जाओ

1.3. ट्रिगर के लिए:

 उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [SQL_TriggerExecStat] ( [आईडी] [bigint] पहचान (1,1) शून्य नहीं, [सम्मिलित दिनांक] [डेटाटाइम] शून्य, [int] [डेटाबेस_आईडी] NULL, [object_id] [int] NULL, [ExecutionCount] [bigint] NULL, [TotalWorkerTime] [bigint] NULL, [TotalElapsedTime] [bigint] NULL) ऑन [PRIMARY]GO

2. सूचना संग्रह के लिए एक दृश्य का निर्माण (यहां हम अप्रासंगिक जानकारी से छुटकारा पाने के लिए फ़िल्टर सम्मिलित कर सकते हैं (उदाहरण के लिए, प्रतिकृति ट्रिगर के साथ प्रश्न और प्रक्रियाएं, आदि)।
2.1. प्रश्नों के लिए:

[DATABASE_NAME] का उपयोग करें [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE दृश्य [srv]। query_stats.execution_count ) AS ExecutionCount, SUM(query_stats.total_worker_time ) AS TotalWorkerTime, MIN(query_stats.statement_text) AS StatementText, MIN(query_stats.min_worker_time) AS MinWorkerTime, MAX(query_stats.total_worker_time) TotalPhysicalReads, MIN(query_stats.min_physical_reads) AS MinPhysicalReads, MAX(query_stats.max_physical_reads) AS MaxPhysicalReads, SUM(query_stats.total_physical_reads) / SUM(query_stats.execution_count) एएस औसतभौतिक रीड्स, एसयूएम(query_stats.total_logical_writes) AS TotalLogicalWrites, MIN(query_stats.min_logical_writes) AS MinLogicalWrites, MAX(query_stats.max_logical_writes ) AS MaxLogicalWrites, SUM(query_country_stats. टोटल_लॉजिकल_रीड्स ) AS TotalLogicalReads, MIN(query_stats.min_logical_reads) AS MinLogicalReads, MAX(query_stats.max_logical_reads ) AS MaxLogicalReads, SUM(query_stats.total_logical_reads) / SUM(query_stats. query_stats.min_elapsed_time) AS MinElapsedTime, MAX(query_stats.max_elapsed_time) AS MaxElapsedTime, SUM(query_stats.total_elapsed_time) / SUM(query_stats.execution_count) AS Av gElapsedTime, MIN(query_stats.creation_time) AS MinCreationTime, MAX(query_stats.last_execution_time) AS LastExecuteTimeFROM (चुनें QS.query_hash, QS.total_worker_time, QS.execution_count ,QS. टोटल_फिजिकल_रीड्स, क्यूएस.टोटल_लॉजिकल_राइट्स, क्यूएस.मिन_लॉजिकल_राइट्स, क्यूएस.मैक्स_लॉजिकल_राइट्स, क्यूएस.मिन_लॉजिकल_रीड्स, क्यूएस.मैक्स_लॉजिकल_रीड्स, क्यूएस.टोटल_लॉजिकल_रीड्स, क्यूएस। ,QS.creation_time ,QS.last_execution_time ,SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1, ((CASE Statement_end_offset WHEN-1 फिर DATALENGTH(ST.text) ELSE QS.statement_end_offset END - QS.offset)/_start_statement 2) + 1) एएस स्टेटमेंट_टेक्स्ट फ्रॉम sys.dm_exec_query_stats AS QS CROSS APPLY sys.dm_exec_sql_text (QS.sql_handle) ST के रूप में) query_stats के रूप में जहां एक्ज़ीक्यूशन_काउंट> 1and last_execution_time>=dateadd(hour,-3,getdate())GROUP BY query_hash। ) QueryHash, AvgCPU_Time, ExecutionCount, TotalWorkerTime, StatementText, MinWorkerTime, MaxWorkerTime, TotalPhysicalReads, MinPhysicalReads, MaxPhysicalReads, AvgPhysicalReads, TotalLogicalWrites, TotalLogicalWrites, MaxLogicalReads, MinLogicalWrites, MaxLogicalReads, MinLogicalWrites, MaxLogicalReads का चयन करें। AvgLogicalReads, TotalElapsedTime, MinElapsedTime, MaxElapsedTime, AvgElapsedTime, MinCreationTime, LastExecuteTimefrom infoGO

यहां, निम्न सिस्टम क्वेरी का उपयोग किया जाता है:sys.dm_exec_query_stats और sys.dm_exec_sql_text।
2.2. संग्रहित प्रक्रियाओं के लिए:

उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE दृश्य [srv]। .total_worker_time ) / SUM (procedure_stats.execution_count) AvgCPU_Time के रूप में, SUM(procedure_stats.execution_count ) AS ExecutionCount, SUM(procedure_stats.total_worker_time ) AS TotalWorkerTime, MIN(Procedure_Textworker_time) AS TotalWorkerTime, MIN(Procedure_Textworker_time) AS. (procedure_stats.max_worker_time ) AS MaxWorkerTime, SUM(procedure_stats.total_physical_reads) AS TotalPhysicalReads, MIN(procedure_stats.min_ph) ysical_reads ) AS MinPhysicalReads, MAX (Procedure_stats.max_ Physical_reads) AS MaxPhysicalReads, SUM (Procedure_stats.total_ Physical_reads) / SUM (Procedure_stats.execution_count) AS AvgPhysicalReads, SUMMIN(Logical_Logical_reads) एएस मैक्सलॉजिकल राइट्स, एसयूएम (प्रक्रिया_स्टैट्स। टोटल_लॉजिकल_राइट्स) / एसयूएम (प्रक्रिया_स्टैट्स। एक्ज़ीक्यूशन_काउंट) एएस एवरोजिकल राइट्स, एसयूएम (प्रक्रिया_स्टैट्स। SUM(procedure_stats.total_logic_reads ) / SUM(procedure_stats.execution_count) AvgLogicalReads के रूप में, SUM(procedure_stats.total_elap) sed_time ) AS TotalElapsedTime, MIN(procedure_stats.min_elapsed_time ) AS MinElapsedTime, MAX(procedure_stats.max_elapsed_time ) AS MaxElapsedTime, SUM(procedure_stats.total_elapsed_time ) / SUM(Caved.execution_stats) AS. प्रक्रिया_stats.last_execution_time) के रूप में LastExecuteTimeFROM (चयन QS.database_id, QS.object_id, QS.type, QS.total_worker_time, QS.execution_count, QS.min_worker_time, QS.max_worker_time, QS. टोटल_लॉजिकल_राइट्स, क्यूएस.मिन_लॉजिकल_राइट्स, क्यूएस.मैक्स_लॉजिकल_राइट्स, क्यूएस.मिन_लॉजिकल_राइट्स, क्यूएस.मिन_लॉजिकल_रीड्स, क्यूएस.मैक्स_लॉजिकल_रीड्स, क्यूएस.टोटल_लॉजिकल_रीड्स, क्यूएस. QS क्रॉस लागू sys.dm_exec_sql_text(QS.sql_handle) ST के रूप में) प्रक्रिया_आँकड़ों के रूप में जहाँ निष्पादन_गणना> 1और last_execution_time>=dateadd(hour,-3,getdate())GROUP BY database_id,object_id) डेटाबेस_आईडी, ऑब्जेक्ट_आईडी, प्रकार, औसत सीपीयू का चयन करें टोटलवर्करटाइम, प्रोसीजर टेक्स्ट, मिनवर्करटाइम, मैक्सवर्करटाइम, टोटल फिजिकल रीड्स, मिनफिजिकल रीड्स, मैक्सफिजिकलरीड s, AvgPhysicalReads, TotalLogicalWrites, MinLogicalWrites, MaxLogicalWrites, AvgLogicalWrites, TotalLogicalReads, MinLogicalReads, MaxLogicalReads, AvgLogicalReads, TotalElapsedTime, MinElapsedTime, GOExElapsedTime, AvgedTime, MinElapsedTime, जानकारी
 

यहां, निम्न सिस्टम क्वेरी का उपयोग किया जाता है:sys.dm_exec_Procedure_stats और sys.dm_exec_sql_text।

2.3. ट्रिगर के लिए:

उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE दृश्य [srv]। .total_worker_time ) / SUM (procedure_stats.execution_count) AvgCPU_Time के रूप में, SUM(procedure_stats.execution_count ) AS ExecutionCount, SUM(procedure_stats.total_worker_time ) AS TotalWorkerTime, MIN(Procedure_Textworker_time) AS TotalWorkerTime, MIN(Procedure_Textworker_time) AS. (procedure_stats.max_worker_time ) AS MaxWorkerTime, SUM(procedure_stats.total_ Physical_reads) AS TotalPhysicalReads, MIN(procedure_stats.min_phys) ical_reads ) AS MinPhysicalReads, MAX(procedure_stats.max_physical_reads) AS MaxPhysicalReads, SUM(procedure_stats.total_physical_reads) / SUM(procedure_stats.execution_count) AS AvgPhysicalReads, SUM. एएस मैक्सलॉजिकल राइट्स, एसयूएम (प्रक्रिया_स्टैट्स। टोटल_लॉजिकल_राइट्स) / एसयूएम (प्रक्रिया_स्टैट्स। एक्ज़ीक्यूशन_काउंट) एएस एवरोजिकल राइट्स, एसयूएम (प्रक्रिया_स्टैट्स। SUM(procedure_stats.total_logical_reads ) / SUM(procedure_stats.execution_count) AvgLogicalReads के रूप में, SUM(procedure_stats.total_elapse) d_time ) AS TotalElapsedTime, MIN(procedure_stats.min_elapsed_time ) AS MinElapsedTime, MAX(procedure_stats.max_elapsed_time ) AS MaxElapsedTime, SUM(procedure_stats.total_elapsed_time ) / SUM(Procedure_stats.total_elapsed_time ) / SUM(Procedure_stats. प्रक्रिया_stats.last_execution_time) के रूप में LastExecuteTimeFROM (चयन QS.database_id, QS.object_id, QS.type, QS.total_worker_time, QS.execution_count, QS.min_worker_time, QS.max_worker_time, QS. Total_logical_writes ,QS .मिन_लॉजिकल_राइट्स, क्यूएस.मैक्स_लॉजिकल_राइट्स, क्यूएस.मिन_लॉजिकल_रीड्स, क्यूएस.मैक्स_लॉजिकल_रीड्स, क्यूएस.टोटल_लॉजिकल_रीड्स, क्यूएस. क्रॉस लागू sys.dm_exec_sql_text(QS.sql_handle) ST के रूप में) प्रक्रिया_आँकड़ों के रूप में जहाँ निष्पादन_काउंट> 1और last_execution_time>=dateadd(hour,-3,getdate())GROUP BY डेटाबेस_आईडी,ऑब्जेक्ट_आईडी)डेटाबेस_आईडी, ऑब्जेक्ट_आईडी, टोटल, वर्करटाइम, ऑब्जेक्ट_आईडी, टाइप, एक्ज़ेक्यूशन_टाइम का चयन करें। , प्रोसीजर टेक्स्ट, मिनवर्करटाइम, मैक्सवर्करटाइम, टोटल फिजिकल रीड्स, मिनफिजिकल रीड्स, मैक्सफिजिकल रीड्स, AvgPhysicalReads, TotalLogicalWrites, MinLogicalWrites, MaxLogicalWrites, AvgLogicalWrites, TotalLogicalReads, MinLogicalReads, MaxLogicalReads, AvgLogicalReads, TotalElapsedTime, MinElapsedTime, MaxElapsedTime, AvgElapsedTime, जानकारी से AvgElapsedTime 

यहां, निम्न सिस्टम क्वेरी का उपयोग किया जाता है:sys.dm_exec_trigger_stats और sys.dm_exec_sql_text।

3. सूचना संग्रह के लिए संग्रहित प्रक्रियाओं का निर्माण।

3.1. प्रश्नों के लिए:

उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। [InsertForSQL_StatementExecStat] @koef दशमलव(12,2)=0.0 -संग्रह गुणांक --अधिक सटीक संग्रह के लिए एक प्रयोगात्मक तरीके से चुना गया है, --in अधिकांश मामलों में, हम 0.0 डाल सकते हैं, --अगर संग्रह चलने की आवृत्ति 5 मिनट से अधिक नहीं है। - गणना की सटीकता संग्रह आवृत्ति और संग्रह गुणांक पर निर्भर करती है। --जितना अधिक बार संग्रह चल रहा है, उतना कम प्रभाव संग्रह गुणांक है। ASBEGIN SET NOCOUNT ON; @AVGCPU_TIMEINT,@MAXAVGCPU_TIMETIMIT, AvgTotalWorkerTime =AVG (TotalWorkerTime), @MaxTotalWorkerTime =अधिकतम (TotalWorkerTime), @AvgAvgElapsedTime =AVG (AvgElapsedTime), @MaxAvgElapsedTime =अधिकतम (AvgElapsedTime), @AvgTotalElapsedTime।; srv में डालें। , [TotalElapsedTime] srv.vStatementExecInfo से जहाँ(AvgCPU_Time> @AvgCPU_Time + @koef * (@MaxAvgCPU_Time - @AvgCPU_Time)) या (TotalWorkerTime> @AvgTotalWorkerTime + @koef * (@MaxTotalWorkerTimesd - @MaxTotalWorkerTimes)) या + @koef * (@MaxAvgElapsedTime - @AvgAvgElapsedTime)) या (TotalElapsedTime> @AvgTotalElapsedTime + @koef * (@MaxTotalElapsedTime - @AvgTotalElapsedTime));ENDGO

3.2. संग्रहित प्रक्रियाओं के लिए:

[DATABASE_NAME] का उपयोग करें ज्यादातर मामलों में, हम 0.0 डाल सकते हैं, - यदि संग्रह चलने की आवृत्ति 5 मिनट से अधिक नहीं है। - गणना की सटीकता संग्रह आवृत्ति और संग्रह गुणांक पर निर्भर करती है। --जितना अधिक बार संग्रह चल रहा है, उतना कम प्रभाव संग्रह गुणांक है। ASBEGIN SET NOCOUNT ON; @AvgCPU_Time bigint, @MaxAvgCPU_Time bigint, @AvgTotalWorkerTime bigint, @MaxTotalWorkerTime Bigint, @AvgAvgElapsedTime Bigint, @MaxAvgElapsedTime Bigint,@AvgTotalElapsedMaxTotal Bigint घोषित करें; चयन करें AvgTotalElapsedTime =AVG (TotalElapsedTime), @MaxTotalElapsedTime =अधिकतम (TotalElapsedTime) srv.vProcedureExecInfo से; srv में डालें। , [TotalWorkerTime] , [TotalElapsedTime] , [TotalPhysicalReads] , [TotalLogicalReads] , [TotalLogicalWrites] srv.vProcedureExecInfo से जहां (AvgCPU_Time> @AvgCPU_Time + @koef * @ TimeCPU_Time - @AvgCPU_Time + @koef * @TotalPU_Time - @AvgCtalWork) koef * (@MaxTotalWorkerTime - @AvgTotalWorkerTime)) या (AvgElapsedTime> @AvgAvgElapsedTime + @koef * (@MaxAvgElapsedTime - @AvgAvgElapsedTime)) या (TotalElapsedTime> @AvgTotalElapsedTime + Tokoef apsedTime - @AvgTotalElapsedTime));ENDGO

3.3. ट्रिगर के लिए:

उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। ज्यादातर मामलों में, हम 0.0 डाल सकते हैं, --अगर संग्रह चलने की आवृत्ति 5 मिनट से अधिक नहीं है। - गणना की सटीकता संग्रह आवृत्ति और संग्रह गुणांक पर निर्भर करती है। --जितना अधिक बार संग्रह चल रहा है, उतना कम प्रभाव संग्रह गुणांक है। ASBEGIN SET NOCOUNT ON; @AVGCPU_TIMEINT,@MAXAVGCPU_TIMETIMIT, AvgTotalWorkerTime =AVG (TotalWorkerTime), @MaxTotalWorkerTime =अधिकतम (TotalWorkerTime), @AvgAvgElapsedTime =AVG (AvgElapsedTime), @MaxAvgElapsedTime =अधिकतम (AvgElapsedTime), @AvgTotalElapsedTime =MaxTotalElapsedTime =AVG (TotalElapsedTime =AVG)।; srv में डालें। जहां(AvgCPU_Time> @AvgCPU_Time + @koef * (@MaxAvgCPU_Time - @AvgCPU_Time)) या (TotalWorkerTime> @AvgTotalWorkerTime + @koef * (@MaxTotalWorkerTime - @AvgTotalWorkerTime)) या (AvgElapsedTime - @AvgElapsedTime)) या (AvgElapsedTime) @AvgAvgElapsedTime)) या (TotalElapsedTime> @AvgTotalElapsedTime + @koef * (@MaxTotalElapsedTime - @AvgTotalElapsedTime));ENDGO

4. सूचना आउटपुट के लिए एक दृश्य का निर्माण।

4.1. प्रश्नों के लिए:

उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE देखें [srv]। कन्वर्ट (दशमलव(8,2), औसत बीतता समय/100000.) औसत के रूप में,... ,QueryHash , StatementText [SRV] से। 

4.2. संग्रहित प्रक्रियाओं के लिए:

[DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE देखें [srv] का उपयोग करें। , कन्वर्ट (दशमलव (8,2), औसत बीतने का समय / 1000000।) औसत विलुप्त होने के रूप में, ..., डेटाबेस_आईडी, ऑब्जेक्ट_आईडी, डीबी_नाम (डेटाबेस_आईडी) डीबी_नाम के रूप में, ओबीजेईसीटी_एससीईएमए_नाम (ऑब्जेक्ट_आईडी, डेटाबेस_आईडी) स्कीमा_नाम, ऑब्जेक्ट_आईडी, प्रक्रिया_आईडी के रूप में स्कीमा_नाम, ऑब्जेक्ट_नाम (ऑब्जेक्ट_आईडी) के रूप में [SRV] से।[srv]।[vProcedureExecInfo];GO

4.3. ट्रिगर्स के लिए दृश्य एक समान तरीके से बनाए जाते हैं (यदि आवश्यक हो)। मेरे लिए, मुझे ट्रिगर्स को ट्रेस करने की आवश्यकता नहीं है, क्योंकि अगर ट्रिगर्स के साथ कोई समस्या है, तो संग्रहित प्रक्रियाओं और प्रश्नों का निष्पादन उन्हें दिखाएगा।

कार्यान्वित विचारों के लिए निम्नलिखित दो मापदंडों का महत्वपूर्ण महत्व है:

  1. AvgWorkerSec — क्वेरी निष्पादन समय सेकंड में।
  2. AvgElapsedSec — प्रतीक्षा समय, या प्रतीक्षा समय+AvgWorkerSec.

विचारों के परिणामों के लिए, निम्नलिखित समानता महत्वपूर्ण है:

AvgWorkerSec=AvgElapsedSec

  1. AvgWorkerSec>AvgElapsedSec - यहां क्वेरी के निष्पादन के समय कुछ प्रोसेसर बहुत अधिक लोड करता है (जैसा कि यह निकला, एंटीवायरस सॉफ़्टवेयर स्कैन चल रहा था; यह समानांतर योजना का दोष भी हो सकता है)।
  2. औसत कार्यकर्तासेक

यदि AvgWorkerSec=AvgElapsedSec का पालन किया जाता है, तो लंबा निष्पादन समय क्वेरी और उसके निष्पादन समय से संबंधित होता है।

लंबी क्वेरी निष्पादन का मानदंड क्या है?

इस प्रश्न का कोई पूर्ण उत्तर नहीं है। यह इस बात पर निर्भर करता है कि कोई क्वेरी क्या करती है, इसका उपयोग कहां और कैसे किया जाता है, आदि।

मेरे पास तदर्थ प्रश्नों और संग्रहीत कार्यविधियों के लिए निम्नलिखित मूल्यांकन हैं:

  1. 0.5 तक - संग्रहित प्रक्रियाओं के लिए अच्छा है, कोई समस्या नहीं (कोई निष्पादन प्रतीक्षा नहीं)।
  2. 0.1 तक - प्रश्नों के लिए अच्छा, कोई समस्या नहीं (कोई निष्पादन प्रतीक्षा नहीं)।
  3. 0.5 - 1.0 - संग्रहित प्रक्रियाओं के लिए खराब, समस्याएं हैं (कोई निष्पादन प्रतीक्षा नहीं है जो उपयोगकर्ता को दिखाई दे, लेकिन वे अभी भी मौजूद हैं और समाधान की आवश्यकता है)।
  4. 0.1 - 0.5 - प्रश्नों के लिए बुरा है, समस्याएं हैं (कोई निष्पादन प्रतीक्षा नहीं है जो उपयोगकर्ता को दिखाई दे, लेकिन वे अभी भी मौजूद हैं और उन्हें हल करने की आवश्यकता है)।
  5. 1.0 से अधिक - संग्रहीत कार्यविधियों के लिए खराब, समस्याएं हैं (इस बात की अधिक संभावना है कि उपयोगकर्ताओं को दिखाई देने वाली प्रतीक्षाएं हैं, समस्या के लिए तत्काल समाधान की आवश्यकता है)।
  6. 0.5 से अधिक - प्रश्नों के लिए बुरा, समस्याएं हैं (इस बात की अधिक संभावना है कि उपयोगकर्ताओं को दिखाई देने वाली प्रतीक्षाएं हैं, समस्या के लिए तत्काल समाधान की आवश्यकता है)।

गैर-तदर्थ प्रश्नों (डेटा अपलोड, डेटा लोड) के लिए, उपरोक्त मूल्यांकन व्यक्तिगत आधार पर चुना जाता है। आमतौर पर, यह तदर्थ प्रश्नों और संग्रहीत कार्यविधियों के मूल्यांकन से काफी अधिक होता है।

यदि सभी सॉफ़्टवेयर संग्रहीत कार्यविधियों के माध्यम से कार्य करते हैं, तो आप केवल संग्रहीत कार्यविधियों का पता लगा सकते हैं, क्योंकि क्वेरी का कार्य हमेशा संग्रहीत कार्यविधियों के कार्य को प्रभावित करता है। इसलिए, आइए संग्रहीत प्रक्रियाओं के निष्पादन के विश्लेषण पर समझौता करें।

आइए निम्नलिखित एल्गोरिथम के अनुसार बाद के विश्लेषण और ऑटोट्रेस चलाने के लिए सबसे भारी संग्रहीत प्रक्रियाओं के बारे में जानकारी एकत्र करने के लिए एक प्रणाली बनाएं:

1. जानकारी संग्रहीत करने के लिए एक तालिका का निर्माण:

 उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [SQL_TopProcedureExecStat] ( [Row_GUID] [अद्वितीय पहचानकर्ता] शून्य नहीं, [सर्वर] [nvarchar] (255) शून्य नहीं, [DB_ID] शून्य नहीं, [DB_ID] , [OBJECT_ID] [int] नॉट न्यूल, [एक्ज़ीक्यूशनकाउंट] [बिगिन्ट] नॉट न्यूल, [टोटलवर्करटाइम] [बिगिन्ट] न्यूल, [टोटलएलेप्सडटाइम] [बिगिन्ट] न्यूल, [फंक] [दशमलव] (8, 2) न्यूल, [एवीजीवर्करसेक ] [दशमलव] (8, 2) न्यूल, [औसत बीत गया] [दशमलव] (8, 2) न्यूल, [डीबी_NAME] [नवरचर] (255) न्यूल, [SCHEMA_NAME] [नवरचर] (255) न्यूल, [OBJECT_NAME] [ nvarchar](255) NULL, [InsertUTCDate] [डेटाटाइम] नॉट न्यूल, [TotalPhysicalReads] [bigint] NULL, [TotalLogicalReads] [bigint] NULL, [TotalLogicalWrites] [bigint] NULL, [AvgPhysicalReads] [bigint] NULL, [AvgLogical Reads ] [bigint] NULL, [AvgLogicalWrites] [bigint] NULL, [CategoryName] [nvarchar](255) NULL, CONSTRAINT [PK_ SQL_TopProcedureExecStat] प्राथमिक कुंजी क्लस्टर ([Row_GUID] ASC) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PON) GOTERONAB [PRITOP_PAGE] GOTERONAB [प्रक्रिया IMARY] ] बाधा जोड़ें [DF_SQL_TopProcedureExecStat_Row_GUID] डिफ़ॉल्ट (newid ()) [Row_GUID] गोल्टर टेबल [srv] के लिए। CONSTRAINT [DF_SQL_TopProcedureExecStat_InsertUTCDate] [InsertUTCDate]GO
के लिए डिफ़ॉल्ट (getutcdate ())

2. जानकारी एकत्र करने के लिए एक संग्रहीत कार्यविधि का निर्माण:

 उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। [InsertTopProcedureExecStat] @top tinyint =24 - रिकॉर्ड स्टोर करने के लिए दिनों की संख्या, @ COUNTASBEGryName nvarchar (255) Sec' चयन के लिए एक श्रेणी NOVERchar(255)='Av' पर; [srv] में सम्मिलित करें। SecDate, श्रेणी का नाम, कुल भौतिक रीड्स, टोटल लॉजिकल रीड्स, टोटल लॉजिकल राइट्स, औसत भौतिक रीड्स, औसत लॉजिकल रीड्स, औसत लॉजिकल राइट्स) शीर्ष [@top) [डेटाबेस_आईडी], [लैप्स, वर्कटाइम], [टोटलव] [डेटाबेस_आईडी], [लैप्सड, वर्कटाइम], [टोटलव] का चयन करें। [DB_NAME], [SCHEMA_NAME], [PROCEDURE_NAME], UTCDate, C डालें ategoryName ,TotalPhysicalReads ,TotalLogicalReads ,TotalLogicalWrites ,AvgPhysicalReads ,AvgLogicalReads ,AvgLogicalWrites from( select [database_id] ,[object_id] ,[Num] ,[TotalWorkerTime] ,[TotalElapsedTime] ,[AvgWorkerSec] ,[AvgElapsedSec] ,[DB_NAME] ,[SCHEMA_NAME] ,[PROCEDURE_NAME] ,getUTCDate() as InsertUTCDate ,@CategoryName as CategoryName ,TotalPhysicalReads ,TotalLogicalReads ,TotalLogicalWrites ,AvgPhysicalReads ,AvgLogicalReads ,AvgL ogicalWrites FROM [srv].[vProcedureExecTotalInfoHour] ) as t order by case @CategoryName when 'TotalWorkerTime' then TotalWorkerTime when 'TotalElapsedTime' then TotalElapsedTime when 'AvgWorkerSec' then AvgWorkerSec when 'AvgElapsedSec' then AvgElapsedSec when 'TotalPhysicalReads' then TotalPhysicalReads when 'TotalLogicalReads' then TotalLogicalReads when 'TotalLogicalWrites' then TotalLogicalWrites when 'AvgPhysicalReads' then AvgPhysicalReads when 'AvgLogicalReads' then AvgLogicalReads when 'AvgLogicalWrites' then AvgLogicalWrites end desc; declare @count int=(select count(*) from [srv].[SQL_TopProcedureExecStat] where [email protected]); declare @diff [email protected]@top;;with tbl_del as( select Row_GUID from [srv].[SQL_TopProcedureExecStat] where InsertUTCDate0) begin;with tbl_del as( select top(@diff) Row_GUID from [srv].[SQL_TopProcedureExecStat] where [email protected] order by case @CategoryName when 'TotalWorkerTime' then TotalWorkerTime when 'TotalElapsedTime' then TotalElapsedTime when 'AvgWorkerSec' then AvgWorkerSec when 'AvgElapsedSec' then AvgElapsedSec when 'TotalPhysicalReads' then TotalP hysicalReads when 'TotalLogicalReads' then TotalLogicalReads when 'TotalLogicalWrites' then TotalLogicalWrites when 'AvgPhysicalReads' then AvgPhysicalReads when 'AvgLogicalReads' then AvgLogicalReads when 'AvgLogicalWrites' then AvgLogicalWrites end ) delete from [srv].[SQL_TopProcedureExecStat] where Row_GUID in (select Row_GUID from tbl_del); end declare @DB_ID int declare @OBJECT_ID int declare @top1 int =3 declare @diff1 int declare @count1 int -- deletion of more than @top1 times repeats of the specific procedure select top (1) @count1 =tp.num ,@DB_ID =tp.DB_ID ,@OBJECT_ID =tp.OBJECT_ID from (select count(*) as num, DB_ID, OBJECT_ID from [srv].[SQL_TopProcedureExecStat] where [email protected] group by DB_ID, OBJECT_ID) as tp order by tp.num desc; set @diff1 =@count1 - @top1; if(@diff1)> 0 begin;with tbl_del as( select top(@diff1) Row_GUID from [srv].[SQL_TopProcedureExecStat] where DB_ID =@DB_ID and OBJECT_ID =@OBJECT_ID and [email protected] order by case @CategoryName when 'TotalWorkerTime' then TotalWorkerTime when 'TotalElapsedTime' then TotalElapsedTime when 'AvgWorkerSec' then AvgWorkerSec when 'AvgElapsedSec' then AvgElapsedSec when 'TotalPhysicalReads' then TotalPhysicalReads when 'TotalLogicalReads' then Tot alLogicalReads when 'TotalLogicalWrites' then TotalLogicalWrites when 'AvgPhysicalReads' then AvgPhysicalReads when 'AvgLogicalReads' then AvgLogicalReads when 'AvgLogicalWrites' then AvgLogicalWrites end ) delete from [srv].[SQL_TopProcedureExecStat] where Row_GUID in (select Row_GUID from tbl_del); end -- deletion of more than 1 repeats of the AvgWorkerSec parameter for the specific procedure if @CategoryName ='AvgWorkerSec' begin declare @AvgWorkerSec decimal(8,2) select top (1) @count1 =tp.num ,@DB_ID =tp.DB_ID ,@OBJECT_ID =tp.OBJECT_ID ,@AvgWorkerSec =tp.AvgWorkerSec from (select count(*) as num, DB_ID, OBJECT_ID, AvgWorkerSec from [srv].[SQL_TopProcedureExecStat] where [email protected] group by DB_ID, OBJECT_ID,AvgWorkerSec) as tp order by tp.num desc; set @diff1 =@count1 - 1; if(@diff1)> 0 begin;with tbl_del as( select top(@diff1) Row_GUID from [srv].[SQL_TopProcedureExecStat] where DB_ID =@DB_ID and OBJECT_ID =@OBJECT_ID and [email protected] and AvgWorkerSec =@AvgWorkerSec order by InsertUTCDate desc ) delete from [srv].[SQL_TopProcedureExecStat] where Row_GUID in (select Row_GUID from tbl_del); end end if @CategoryName ='AvgElapsedSec' begin declare @AvgElapsedSec decimal(8,2) select top (1) @count1 =tp.num ,@DB_ID =tp.DB_ID ,@OBJECT_ID =tp.OBJECT_ID ,@AvgElapsedSec =tp.AvgElapsedSec from (select count(*) as num, DB_ID, OBJECT_ID, AvgElapsedSec from [srv].[SQL_TopProcedureExecStat] where [email protected] group by DB_ID, OBJECT_ID,AvgElapsedSec) as tp order by tp.num desc; set @diff1 =@count1 - 1; if(@diff1)> 0 begin;with tbl_del as( select top(@diff1) Row_GUID from [srv].[SQL_TopProcedureExecStat] where DB_ID =@DB_ID and OBJECT_ID =@OBJECT_ID and [email protected] and AvgElapsedSec =@AvgElapsedSec order by InsertUTCDate desc ) delete from [srv].[SQL_TopProcedureExecStat] where Row_GUID in (select Row_GUID from tbl_del); end endENDGO

It is better to run this stored procedure immediately after collecting information about the stored procedures (we can set up a task in Agent for running it every 5-10 minutes for queries, stored procedures and triggers):

exec [srv].[InsertForSQL_StatementExecStat]; --collecting information about executed queriesexec [srv].[InsertForTriggerExecStat]; --collecting information about executed triggersexec [srv].[InsertForProcedureExecStat]; --collecting information about executed stored procedures--collecting information about the most heavy executed stored procedures, according to the criteriaexec [srv].[InsertTopProcedureExecStat] @[email protected], @CategoryName='AvgWorkerSec';exec [srv].[InsertTopProcedureExecStat] @[email protected], @CategoryName='AvgElapsedSec'

3. Running trace (every 5-10 minutes with the help of the Agent tasks, preferably right after collecting information):

USE [DATABASE_NAME];go--coefficient of transition value of indicatordeclare @koef_red numeric(8,3)=1.3; --if there are records with the indicator greater than or equal to the --preset indicator coefficient if(exists( SELECT top(1) 1 FROM [srv].[SQL_TopProcedureExecStat] where CategoryName='AvgElapsedSec' or CategoryName='AvgWorkerSec' group by CategoryName having avg([AvgElapsedSec])>[email protected]_red or avg([AvgWorkerSec])>[email protected]_red)) begin --running autorace exec .[srv].[AutoTrace]; end

The auto-trace stored procedure is implemented on an individual basis. उदाहरण के लिए:

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[AutoTrace] @maxfilesize bigint=200 --maximum file size in Mb ,@run_minutes int=60 --tracing length in minutes ,@file_patch nvarchar(255)=N'Path to directory' --directory for trace file ,@file_name nvarchar(255)=N'Profiler' --file name ,@res_msg nvarchar(255)=NULL output --result in the form of messagesASBEGIN SET NOCOUNT ON; declare @rc int; declare @TraceID int; if(@run_minutes>=1200) set @run_minutes=1200; --no longer than 20 hours! declare @finish_dt datetime=DateAdd(minute,@run_minutes,GetDate()); --execution end time --end of trace file declare @finish_dt_inc nvarchar(255)=N'_'+cast(YEAR(@finish_dt) as nvarchar(255))+'_'+cast(MONTH(@finish_dt) as nvarchar(255))+'_'+cast(DAY(@finish_dt) as nvarchar(255)); declare @File nvarchar(255)[email protected]@[email protected]_dt_inc; --full name of the trace file DECLARE @result bit; DECLARE @msgerrors nvarchar(255); DECLARE @oldDT datetime; --Getting the last date and time if(object_id('DATABASE_NAME.dbo.TraceTable')<>0) begin select @oldDT=max(StartTime) from DATABASE_NAME.dbo.TraceTable where StartTime is not null; end --select @oldDT; --If the last date and time is not specified or it is less than time of trace ending,trace is run. Otherwise, the trace was executed on this date. if(@oldDT is null or @oldDT=10) set @run_delay_hour_str=cast(@run_delay_hour as nvarchar(255)); --select @run_delay_hour, @run_delay_hour_str; --adding missing nulls for string representation of minutes if(@run_delay_minute=0) set @run_delay_minute_str='00'; else if(@run_delay_minute<10) set @run_delay_minute_str='0'+cast(@run_delay_minute as nvarchar(255)); else if(@run_delay_minute>=10) set @run_delay_minute_str=cast(@run_delay_minute as nvarchar(255)); --select @run_delay_minute, @run_delay_minute_str; --the hours:minutes string representation for the wait declare @run_delay_str nvarchar(255)[email protected]_delay_hour_str+':'[email protected]_delay_minute_str; --wait WAITFOR DELAY @run_delay_str; --select @run_delay_str; --deletion of the trace table, if it exists if(object_id('DATABASE_NAME.dbo.TraceTable')<>0) begin drop table DATABASE_NAME.dbo.TraceTable; end --creation and filling of the trace table from the trace file SELECT * INTO DATABASE_NAME.dbo.TraceTable FROM ::fn_trace_gettable(@File+'.trc', default); --adding extension to the full file set @[email protected]+'.trc'; --here, we need to insert code to delete the trace file declare @str_title nvarchar(max)='There was auto trace on the server'[email protected]@servername, @str_pred_mess nvarchar(max)='На '[email protected]@servername+'The auto trace has been run on the server. You can view the result in the Database_Name.dbo.TraceTable table; --here, we can send the auto trace run notification to administrator end --returning the result set @res_msg=N'ErrorCode='+cast(@rc as nvarchar(255))+'\r\n'+coalesce(@msgerrors, ''); endENDGO

For more information on setting trace, refer to How to:Create a Trace (Transact-SQL).

निष्कर्ष

In this article, we considered an example of implementation of a system for collecting information about the state of a database, that does not load the system. In case of problem detection, this system runs the preset trace and saves results into a table. This approach can be extended to several servers. In this case, we need to collect information from all servers for subsequent sending of information to administrators.

It is also important to remember about deletion of old data from the used tables. It is quite sufficient to store data within a month or two weeks.

Also read:

Implementing a Common MS SQL Server Performance Indicator

References

  • sys.dm_exec_trigger_stats
  • sys.dm_exec_procedure_stats
  • sys.dm_exec_query_stats
  • sys.dm_exec_sql_text
  • How to:Create a Trace (Transact-SQL)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं SQL सर्वर 2005 में कॉलम के रूप में यादृच्छिक संख्या कैसे वापस कर सकता हूं?

  2. SQL सर्वर:PARTITION BY और GROUP BY के बीच अंतर

  3. SQL सर्वर (T-SQL) में डेटाबेस की सूची प्राप्त करने के 3 तरीके

  4. एसक्यूएल में औसत को गोल करते समय मैं दशमलव कैसे प्राप्त करूं

  5. SQL सर्वर .bak फ़ाइल को MySQL में कैसे आयात करें?