Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Внедряване на общ индикатор за производителност на MS SQL Server

Въведение

Често има нужда да се създаде индикатор за ефективност, който да показва дейността на базата данни, свързана с предходния период или конкретен ден. В статията, озаглавена „Внедряване на индикатор за производителност на SQL Server за заявки, съхранени процедури и тригери“, предоставихме пример за внедряване на този индикатор.

В тази статия ще опишем друг прост начин за проследяване как и колко време отнема изпълнението на заявката, както и как да извлечете планове за изпълнение за всяка времева точка.

Този метод е особено полезен в случаите, когато трябва да генерирате ежедневни отчети, така че можете не само да автоматизирате метода, но и да го добавите към отчета с минимални технически подробности.

В тази статия ще разгледаме пример за внедряване на този общ индикатор за ефективност, при който общото изминало време ще служи като показател.

Решение

Първо, ние предоставяме общ алгоритъм:

1) Направете моментна снимка на активните заявки
2) Запазете резултата
3) Извършете общ анализ и запазете резултата в таблица в края на деня
4) Направете сравнителен анализ от получените данни

Сега ще предоставим някои подробности.

За да направите моментна снимка на активните заявки, създайте следните таблици:

  1. Таблица с планове за заявки
    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[PlanQuery]( [PlanHandle] [varbinary](64) NOT NULL, [SQLbinHandle](6) [SQLbinHandle](6) NULL, [QueryPlan] [xml] NULL, [InsertUTCDate] [datetime] NOT NULL, ОГРАНИЧЕНИЕ [PK_PlanQuery] ПЪРВИЧЕН КЛУШЕР КЛУСТРИРАН ( [SQLHandle] ASC, [PlanHandle] ASC)WITH (PAD_INDEX =ИЗКЛ., ИЗКЛ. , ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [srv].[PlanQuery] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_PlanQuery_Insert(GO)GETUTC DEFAULT(GOGETUTCDE)> 
  2. Таблица със заявки
    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[SQLQuery]( [SQLHandle] [varbinary](64) NOT NULL, [TSQL](manull) [nvar] [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_SQLQuery] ПЪРВИЧЕН КЛУСТРИРАН ( [SQLHandle] ASC) С (PAD_INDEX =ИЗКЛЮЧЕНО, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF) OFF, ALLONAGEPORAKSON =OFF, ALLONAGEPIMAKSON [ОСНОВЕН] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [srv].[SQLQuery] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ [DF_SQLQuery_InsertUTCDate] ПО ПРАВО (getutcdate()) ЗА [InsertUTCDate]GO
  3. Таблица със моментни снимки на активни заявки:
    [expand title=”Code”]

    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[RequestStatistics]( [session_id] [smallint] NOT NULL, [request_id] [int] NULL, [start_time] [date, time]us NULL [date, time]us nvarchar](30) NULL, [command] [nvarchar](32) NULL, [sql_handle] [varbinary](64) NULL, [statement_start_offset] [int] NULL, [statement_end_offset] [int] NULL, [plan_handle] [varbinary ](64) NULL, [database_id] [smallint] NULL, [user_id] [int] NULL, [connection_id] [uniqueidentifier] NULL, [blocking_session_id] [smallint] NULL, [wait_type] [nvarchar](60) NULL wait_time] [int] NULL, [last_wait_type] [nvarchar](60) NULL, [wait_resource] [nvarchar](256) NULL, [open_transaction_count] [int] NULL, [open_resultset_count] [int] NULL, [transaction_id] [bigint_id] ] NULL, [context_info] [varbinary](128) NULL, [percent_complete] [real] NULL, [estimated_completion_time] [bigint] NULL, [cpu_time] [int] NULL, [total_elapsed_time] [int] NULL, [scheduler_id] int] NULL, [адрес_на_задача] [варбиниран](8) NULL, [чете] [bigint] NULL, [записва] [bigint] NULL, [logical_reads] [bigint] NULL, [текст_размер] [int] NULL, [език] [nvarchar](128) NULL, [format_date] [nvarchar ](3) NULL, [date_first] [smallint] NULL, [quoted_identifier] [bit] NULL, [arithabort] [bit] NULL, [ansi_null_dflt_on] [bit] NULL, [ansi_defaults] [bit] NULL, [ansi_warning bit] NULL, [ansi_padding] [bit] NULL, [ansi_nulls] [bit] NULL, [concat_null_yields_null] [bit] NULL, [transaction_isolation_level] [smallint] NULL, [lock_timeout] [int] NULL, [deadlock_prio] NULL, [row_count] [bigint] NULL, [prev_error] [int] NULL, [nest_level] [int] NULL, [granted_query_memory] [int] NULL, [executing_managed_code] [bit] NULL, [group_id] [int] NULL, [query_hash] [binary](8) NULL, [query_plan_hash] [binary](8) NULL, [most_recent_session_id] [int] NULL, [connect_time] [datetime] NULL, [net_transport] [nvarchar](40) NULL, [ protocol_type] [nvarchar](40) NULL, [protocol_version] [int] NULL, [endpoint_id] [int] NULL, [encrypt_option ] [nvarchar](40) NULL, [auth_scheme] [nvarchar](40) NULL, [node_affinity] [smallint] NULL, [num_reads] [int] NULL, [num_writes] [int] NULL, [last_read] [datetime] NULL, [last_write] [datetime] NULL, [net_packet_size] [int] NULL, [client_net_address] [varchar](48) NULL, [client_tcp_port] [int] NULL, [local_net_address] [varchar](48) [lo_cal_tc, NULL ] [int] NULL, [parent_connection_id] [uniqueidentifier] NULL, [most_recent_sql_handle] [varbinary](64) NULL, [login_time] [datetime] NULL, [host_name] [nvarchar](128) NULL, [nvarchar_name] (128) NULL, [host_process_id] [int] NULL, [client_version] [int] NULL, [client_interface_name] [nvarchar](32) NULL, [security_id] [varbinary](85) NULL, [login_name] [nvarchar]( 128) NULL, [nt_domain] [nvarchar](128) NULL, [nt_user_name] [nvarchar](128) NULL, [memory_usage] [int] NULL, [total_scheduled_time] [int] NULL, [last_request_dall_time] NULL [last_request_end_time] [datetime] NULL, [is_user_process] [bit] NULL, [original_sec urity_id] [varbinary](85) NULL, [original_login_name] [nvarchar](128) NULL, [last_successful_logon] [datetime] NULL, [last_unsuccessful_logon] [datetime] NULL, [unsuccessful_logons] [unsuccessful_logons] [unsuccessful_logons] [unsuccessful_logons] [unsuccessful_logons] [unsuccessful_logons] [unsuccessful_logons] ] NULL, [InsertUTCDate] [datetime] NOT NULL, [EndRegUTCDate] [datetime] NULL) НА [PRIMARY]GOALTER TABLE [srv].[RequestStatistics] ДОБАВИ ОГРАНИЧЕНИЕ [DF_RequestStatistics_InsertGOSETGOSETDate] ПО ПОДРАЗБИРАНЕ (getutcdate]DateInsPAert()GETUTCDATEINSPAert() ONGOCREATE CLUSTERED INDEX [indRequest] ON [srv].[RequestStatistics]( [session_id] ASC, [request_id] ASC, [database_id] ASC, [user_id] ASC, [start_time] ASC, [command] ASC, [sql_handle] ASC, [plan_handle] ASC, [transaction_id] ASC, [connection_id] ASC)WITH (PAD_INDEX =ИЗКЛ., STATISTICS_NORECOMPUTE =ИЗКЛ., SORT_IN_TEMPDB =ИЗКЛ., DROP_EXISTING =ИЗКЛ., ONLINE =ИЗКЛЮЧЕНО, ALLOW_ROW_LOCOWKS] =OFF ANSI_PADDING ONGOCREATE NONCLUSTERED INDEX [indPlanQuery] ON [srv].[RequestStatistics]( [plan_handle] ] ASC, [sql_handle] ASC)КЪДЕ ([sql_handle] НЕ Е NULL И [plan_handle] НЕ Е NULL)С (PAD_INDEX =ИЗКЛЮЧЕНО, STATISTICS_NORECOMPUTE =ИЗКЛЮЧЕНО, SORT_IN_TEMPDB =OFF, DROP_OFF_,EXISTONLO =DROP_,EXISTONLO ALLOW_PAGE_LOCKS =ВКЛ.) НА [PRIMARY]GO

    [/expand]

    По подобен начин създаваме таблица за архива [srv].[RequestStatisticsArchive].

  4. Таблица с обща дневна статистика
    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[TSQL_DAY_Statistics]( [команда] [nvarchar](32) NOT NULL, [DBName](128) [nvar)] NOT NULL, [PlanHandle] [varbinary](64) NOT NULL, [SqlHandle] [varbinary](64) NOT NULL, [execution_count] [bigint] NOT NULL, [min_wait_timeSec] [decimal](23, 8) NOT NULL, [min_estimated_completion_timeSec] [десетична](23, 8) НЕ NULL, [min_cpu_timeSec] [десетична](23, 8) НЕ NULL, [min_total_elapsed_timeSec] [десетична](23, 8) НЕ NULL, [min_cpu_timeSec] [min_ec] , 8) NOT NULL, [max_wait_timeSec] [decimal](23, 8) NOT NULL, [max_estimated_completion_timeSec] [decimal](23, 8) NOT NULL, [max_cpu_timeSec] [decimal](23, edimated_completion_timeSec) [decimal](23, 8) NOT NULL, [max_cpu_timeSec] [decimal](23, ED_TIMESEC, OT NULL_8) ] [десетична](23, 8) НЕ NULL, [max_lock_timeoutSec] [десетична](23, 8) НЕ NULL, [ДАТА] [дата] НЕ NULL) НА [ОСНОВНА] ТАБЛИЦА НА ГОЛТЪРИТЕ [srv].[TSQL_DAY_Statistics] ДОБАВЯНЕ НА ОГРАНИЧЕНИЕТО [DF_TSQL_DAY_Statistics_DATE] ПО ПОДРАЗБИРАНЕ (getutcdate()) ЗА [ДАТА]СЪЗРАВЕТЕ НЕКЛУСТРИРАН ИНДЕКС [indDATE] НА [srv].[TSQL_DAY_Statistics]( [DATE] ASC) С (PAD_INDEX =ИЗКЛЮЧЕНО, STATISTICS_NORECOMPUTE =ИЗКЛЮЧЕНО, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF_ALL_OFF, DROP_EXISTING =OFF_ALL_EXISTING, ИЗКЛ. =ВКЛ.) НА [ОСНОВНО]GO
  5. Преглед по записани моментни снимки на активни заявки
    [expand title=”Code”]

    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE изглед [srv].[vRequestStatistics] като/*статистически данни на заявката*/SELECT rs.[status] collate Cyrillic_General_CI_AS като [status] ,rs.[InsertrsUTCstar.[Date]] ] ,rs.[command] compare Cyrillic_General_CI_AS като [command] ,rs.[session_id] ,rs.[blocking_session_id] ,round(cast(rs.[total_elapsed_time] as decimal(18,3))/1000, 3) като [ total_elapsed_timeSec] ,DB_NAME(rs.[database_id]) събере Cyrillic_General_CI_AS като [DBName] ,rs.[is_user_process] ,rs.[login_name] collate Cyrillic_General_CI_AS като [login_name] ,rs.[program_name] collate Cyrillic_name като [program_name. [host_name] съпостави Cyrillic_General_CI_AS като [host_name] ,sq.[TSQL] съпостави Cyrillic_General_CI_AS като [TSQL]--,(изберете top(1) текст от sys.dm_exec_sql_text([sql_handle])) като [TSQ.[lan] ] ,rs.[plan_handle] ,rs.[user_id] ,rs.[connection_id] ,rs.[database_id] ,rs.[sql_handle] ,rs.[ statement_start_offset]--Броят на знаците в текущо изпълняващия се пакет или съхранена процедура, в която се изпълнява текущият оператор. Може да се използва заедно с функции за динамично управление, като sql_handle, statement_end_offset и sys.dm_exec_sql_text, за да получите текущо изпълнявания оператор за заявката. NULL стойности са позволени. ,rs.[statement_end_offset]--Броят на знаците в текущо изпълняващия се пакет или съхранена процедура, в която е завършен текущият оператор. Може да се използва заедно с функции за динамично управление, като sql_handle, statement_end_offset и sys.dm_exec_sql_text, за да получите текущо изпълнявания оператор за заявката. NULL стойности са позволени. ,rs.[wait_type] collate Cyrillic_General_CI_AS като [wait_type]--waiting type ,rs.[wait_time]--Ако заявката в момента е блокирана, колоната съдържа време за изчакване (в ms). NULL стойности не са разрешени. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) като [wait_timeSec] ,rs.[last_wait_type] collate Cyrillic_General_CI_AS като [last_wait_type]--Ако заявката е била блокирана по-рано, колоната е била блокирана, колоната. съдържа типа на последното време на изчакване. NULL стойности не са разрешени. ,rs.[wait_resource] collate Cyrillic_General_CI_AS като [wait_resource]--Ако заявката в момента е блокирана, колоната показва ресурса, за който заявката чака да бъде освободена. NULL стойности не са разрешени. ,rs.[open_transaction_count]--Броят транзакции, налични за тази заявка. NULL стойности не са разрешени. ,rs.[open_resultset_count]--Броят на резултантните набори, налични за дадената заявка. NULL стойности не са разрешени. ,rs.[transaction_id]--Идентификатор на транзакция на текущо изпълняваната заявка. NULL стойности не са разрешени. ,rs.[context_info] ,rs.[percent_complete] ,rs.[estimated_completion_time] ,round(cast(rs.[estimated_completion_time] as decimal(18,3))/1000, 3) като [estimated_completion_timeSec] ,rs.[cpu_time]. ]--време на процесора (в ms), изразходвано за изпълнение на заявката. NULL стойности не са разрешени. ,round(cast(rs.[cpu_time] като decimal(18,3))/1000, 3) като [cpu_timeSec] ,rs.[total_elapsed_time]--Общото време, изминало от получаването на заявката (в ms). NULL стойности не са разрешени. ,rs.[scheduler_id]--Идентификатор на планировчика, който планира дадената заявка. NULL стойности не са разрешени. ,rs.[task_address]--адресът на блока памет, посветен на задачата, свързана с тази заявка. NULL стойности са позволени. ,rs.[reads]--Броят четения, извършени от дадената заявка. NULL стойности са позволени. ,rs.[writes]--Броят на записванията, извършени от дадената заявка. NULL стойности не са разрешени. ,rs.[logical_reads]--Броят на логическите четения, изпълнени от дадената заявка. NULL стойности не са разрешени. ,rs.[text_size]--Задаване на параметъра TEXTSIZE за дадената заявка. NULL стойности не са разрешени. ,rs.[language] collate Cyrillic_General_CI_AS като [език]--Задаване на език за дадената заявка. NULL стойности са позволени. ,rs.[date_format] collate Cyrillic_General_CI_AS като [date_format]--Задаване на параметъра DATEFORMAT за дадената заявка. NULL стойности са позволени. ,rs.[date_first]--Задаване на параметъра DATEFIRST за дадената заявка. NULL стойности не са разрешени. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs.[concat_null_yields,rs_null]. .[transaction_isolation_level] – ниво на изолация на транзакциите за дадената заявка. NULL стойности не са разрешени (0 не е посочена, 1 – 5 стойности са зададени във възходящ ред на нивото на изолация на транзакцията). ,rs.[lock_timeout]--Изчакване на заключване за дадената заявка (в ms). NULL стойности не са разрешени. ,round(cast(rs.[lock_timeout] като decimal(18,3))/1000, 3) като [lock_timeoutSec] ,rs.[deadlock_priority]--Стойността на параметъра DEADLOCK_PRIORITY за дадената заявка. NULL стойности не са разрешени. ,rs.[row_count]--Броят на редовете, върнати на клиента за тази заявка. NULL стойности не са разрешени. ,rs.[prev_error]--Възникна предишна грешка при изпълнение на заявката. NULL стойности не са разрешени. ,rs.[nest_level]--Текущото ниво на ниво на влагане на код, изпълнено за дадената заявка. NULL стойности не са разрешени. ,rs.[granted_query_memory]--Броят страници за изпълнение на заявката. NULL стойности не са разрешени. ,rs.[executing_managed_code]--Показва дали дадената заявка в момента изпълнява обектния код на CLR (например процедура, тип или тригер). Този превключвател се задава, когато CLR обектът е в стека, дори когато Transact-SQL кодът е извикан от средата. NULL стойности не са разрешени. ,rs.[group_id]--ID на групата на работното натоварване, към която принадлежи тази заявка. NULL стойности не са разрешени. ,rs.[query_hash]--Двоичната хеш-стойност се изчислява за заявката и се използва за идентифициране на заявки с подобна логика. Възможно е да се използва хеш на заявка, за да се определи използването на статистически ресурси за заявките, които се различават само по своите буквални стойности. ,rs.[query_plan_hash]--Двоичната хеш-стойност се изчислява за плана за изпълнение на заявката и се използва за идентифициране на подобни планове за изпълнение. Възможно е да се използва хеш на плана за намиране на общата цена на заявката с подобни планове за изпълнение. ,rs.[last_request_start_time] ,rs.[last_request_end_time] ,rs.[total_scheduled_time] ,rs.[memory_usage] ,rs.[nt_user_name] collate Cyrillic_General_CI_AS като [nt_user_name] ,rs.[nt_user_name] ,rs.[ne_nt_nt_domain_AS] collate Cyrillic_General_CI_AS като [nt_nt_domain_AS] .[security_id] ,rs.[client_interface_name] collate Cyrillic_General_CI_AS като [client_interface_name] ,rs.[client_version] ,rs.[host_process_id] ,rs.[login_time] ,rs.[most_recent_sql_pandle].[most_recent_sql_handle].[most_recent_sql_handle] ,rs.[client_version] ,rs.[host_process_id] ,rs.[most_recent_sql_pandle].[most_recent_sql_handle] local_tcp_port] ,rs.[local_net_address] съпоставяне на Cyrillic_General_CI_AS като [local_net_address] ,rs.[client_tcp_port] ,rs.[client_net_address] съпоставяне на Cyrillic_General_CI_AS като [client_net_address] като [client_net_address]ndRequest с.[Request]ndRequest] ,Request с [Request], Request] , readuncommitted) вътрешно присъединяване [srv].[PlanQuery] като pq на rs.[plan_handle]=pq.[PlanHandle] и rs.[sql_handle]=pq.[SqlHandle] вътрешно присъединяване [srv].[SQLQuery] като sq на sq. .[SqlHandle]=pq.[SqlHandle] обединява всички SELECT rs.[status] collate Cyrillic_General__ CI_AS ,rs.[InsertUTCDate] ,rs.[start_time] ,rs.[command] collate Cyrillic_General_CI_AS ,rs.[session_id] ,rs.[blocking_session_id] ,round(cast(rs.[total_elapsed_time] като десетичен(18,3)) )/1000, 3) като [total_elapsed_timeSec] ,DB_NAME(rs.[database_id]) collate Cyrillic_General_CI_AS като [DBName] ,rs.[is_user_process] ,rs.[login_name] collate Cyrillic_General_CI_AS_name._G.[ene college Cyrillic_General_CI_AS_NAME] ,rs.[is_user_process] ,rs.[login_name] collate Cyrillic_General_CI_AS_name. [host_name] collate Cyrillic_General_CI_AS ,sq.[TSQL] collate Cyrillic_General_CI_AS--,(изберете текст отгоре(1) от sys.dm_exec_sql_text([sql_handle])) като [TSQL] ,pq.[QueryPlan_].[han] rs.[user_id] ,rs.[connection_id] ,rs.[database_id] ,rs.[sql_handle] ,rs.[statement_start_offset]-- Броят знаци в текущо изпълняващия се пакет или съхранена процедура, в която се изпълнява текущият оператор. . Може да се използва заедно с функциите за динамично управление, като sql_handle, statement_end_offset и sys.dm_exec_sql_text, за да получите текущо изпълнявания оператор за заявката. NULL стойности са позволени. ,rs.[statement_end_offset]--Броят на знаците в текущо изпълняващия се пакет или съхранена процедура, в която е завършен текущият оператор. Може да се използва заедно с функции за динамично управление, като sql_handle, statement_end_offset и sys.dm_exec_sql_text, за да получите текущо изпълнявания оператор за заявката. NULL стойности са позволени. ,rs.[wait_type] collate Cyrillic_General_CI_AS--тип чакане ,rs.[wait_time]--Ако заявката в момента е блокирана, колоната съдържа текущото време на изчакване (в ms). NULL стойности са позволени. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] collate Cyrillic_General_CI_AS--Ако заявката е била блокирана по-рано, колоната съдържа типа на последното чакане. NULL стойности не са разрешени. ,rs.[wait_resource] collate Cyrillic_General_CI_AS--Ако заявката в момента е блокирана, колоната съдържа ресурса, за който заявката чака да бъде освободена. NULL стойности не са разрешени. ,rs.[open_transaction_count]--Броят транзакции, налични за дадената заявка. NULL стойности не са разрешени. ,rs.[open_resultset_count]--Броят на резултантните набори, налични за дадената заявка. NULL стойности не са разрешени. ,rs.[transaction_id] – Идентификатор на транзакцията, в която се изпълнява заявката. NULL стойности не са разрешени. ,rs.[context_info] ,rs.[percent_complete] ,rs.[estimated_completion_time] ,round(cast(rs.[estimated_completion_time] as decimal(18,3))/1000, 3) като [estimated_completion_timeSec] ,rs.[cpu_time]. ]--време на процесора (в ms), изразходвано за изпълнение на заявката. NULL стойности не са разрешени. ,round(cast(rs.[cpu_time] като decimal(18,3))/1000, 3) като [cpu_timeSec] ,rs.[total_elapsed_time]--Общото време, изминало от получаването на заявката (в ms). NULL стойности не са разрешени. ,rs.[scheduler_id]--Идентификатор на планировчика, който планира дадената заявка. NULL стойности не са разрешени. ,rs.[task_address]--адрес на блока памет, посветен на задачата, свързана с тази заявка. NULL стойности са позволени. ,rs.[reads]--Броят четения, извършени от дадената заявка. NULL стойности не са разрешени. ,rs.[writes]--Броят на записванията, извършени от дадената заявка. NULL стойности не са разрешени. ,rs.[logical_reads]--Броят на логическите четения, извършени от дадената заявка. NULL стойности не са разрешени. ,rs.[text_size]--Задаване на параметъра TEXTSIZE за дадената заявка. NULL стойности не са разрешени. ,rs.[language] collate Cyrillic_General_CI_AS--Задаване на езика за дадената заявка. NULL стойности са позволени. ,rs.[date_format] collate Cyrillic_General_CI_AS--Задаване на параметъра DATEFORMAT за дадената заявка. NULL стойности са позволени. ,rs.[date_first]--Задаване на параметъра DATEFIRST за дадената заявка. NULL стойности не са разрешени. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs.[concat_null_yields,rs_null]. .[transaction_isolation_level] – Ниво на изолация, което е създадено заедно с транзакцията за дадената заявка. NULL стойности не са разрешени (0 не е посочена, 1 - 5 стойности се задават нагоре на нивото на изолация на транзакцията). ,rs.[lock_timeout]--Изчакване на заключване за дадената заявка (в ms). NULL стойности не са разрешени. ,round(cast(rs.[lock_timeout] като decimal(18,3))/1000, 3) като [lock_timeoutSec] ,rs.[deadlock_priority]--Стойност на параметъра DEADLOCK_PRIORITY за дадената заявка. NULL стойност не е позволена. ,rs.[row_count]--Брой редове, върнати на клиента за дадената заявка. NULL стойност не е позволена. ,rs.[prev_error]--Възникна предишна грешка при изпълнение на заявката. NULL стойности не са разрешени. ,rs.[nest_level]--Текущото ниво на влагане на код, изпълнено за дадената заявка. NULL стойност не е позволена. ,rs.[granted_query_memory]--Броят страници за изпълнение на заявката. NULL стойност не е позволена. ,rs.[executing_managed_code]--показва дали дадената заявка в момента изпълнява обектния код на CLR (например процедура, тип или тригер). Този превключвател се задава през времето, когато CLR обектът е в стека, дори когато Transact-SQL кодът е извикан от средата. NULL стойности не са разрешени. ,rs.[group_id]--ID на групата на работното натоварване, към която принадлежи тази заявка. NULL стойности не са разрешени. ,rs.[query_hash]--Двоичната хеш-стойност се изчислява за заявката и се използва за идентифициране на заявки с подобна логика. Възможно е да се използва хеш на заявка, за да се определи използването на статистически ресурси за заявки, които се различават само по своите буквални стойности. ,rs.[query_plan_hash]--Двоичната хеш-стойност се изчислява за плана за изпълнение на заявката и се използва за идентифициране на подобни планове за изпълнение. Възможно е да се използва хеш на плана за намиране на общата цена на заявката с подобни планове за изпълнение. ,rs.[last_request_start_time] ,rs.[last_request_end_time] ,rs.[total_scheduled_time] ,rs.[memory_usage] ,rs.[nt_user_name] collate Cyrillic_General_CI_AS ,rs.[nt_domain] collate Cyrillic__AS,.[rs_CIsec_rity_ID].[rs_CIsec_rity].[nt_user_name] client_interface_name] collate Cyrillic_General_CI_AS ,rs.[client_version] ,rs.[host_process_id] ,rs.[login_time] ,rs.[most_recent_sql_handle] ,rs.[parent_connection_id] ,rs.[local_tcp_address] ,rs.[local_tcp_port] ,rs.[local_tcp_ad_port] , net_ral coll. .[client_tcp_port] ,rs.[client_net_address] collate Cyrillic_General_CI_AS ,rs.[EndRegUTCDate] FROM [srv].[RequestStatisticsArchive] като rs с(readuncommitted) вътрешно присъединяване [srv].[PlanQuery] като pq_handlers.[PlanQuery] като pqhandlers].[ pq.[PlanHandle] и rs.[sql_handle]=pq.[SqlHandle] вътрешно присъединяване [srv].[SQLQuery] като sq на sq.[SqlHandle]=pq.[SqlHandle]GO

    [/expand]

  6. Преглед по избор на текущи активни заявки:
    [expand title=”Code”]

    ИЗПОЛЗВАЙТЕ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE изглед [inf].[vRequestDetail] като/*активен, готов за изпълнение и чакащи заявки, както и такива, които изрично блокират други сесии */с tbl0 като ( изберете tbl0 като ( изберете ES). .[session_id] ,ER.[blocking_session_id] ,ER.[request_id] ,ER.[start_time] ,ER.[status] ,ER.[command] ,ER.[percent_complete] ,DB_Name(coalesce(ER.[database_id]) , ES.[database_id])) като [DBName] ,(изберете горния(1) текст от sys.dm_exec_sql_text(ER.[sql_handle])) като [TSQL] ,(изберете top(1) [query_plan] от sys.dm_exec_query_plan). (ER.[plan_handle])) като [QueryPlan] ,ER.[wait_type] ,ES.[login_time] ,ES.[host_name] ,ES.[program_name] ,ER.[wait_time] ,ER.[last_wait_type] ,ER[last_wait_type]. .[wait_resource] ,ER.[open_transaction_count] ,ER.[open_resultset_count] ,ER.[transaction_id] ,ER.[context_info] ,ER.[estimated_completion_time] ,ER.[cpu_time] ,ER.[total_elap]. sed_time] ,ER.[scheduler_id] ,ER.[task_address] ,ER.[четене] ,ER.[записва] ,ER.[логически_четения] ,ER.[текст_размер] ,ER.[език] ,ER.[формат_дата] ,ER.[date_first] ,ER.[quoted_identifier] ,ER.[arithabort] ,ER.[ansi_null_dflt_on] ,ER.[ansi_defaults] ,ER.[ansi_warnings] ,ER.[ansi_padding] ,ER.[ansi_nulls] ,ER.[ansi_nulls] ,ER.[ansi_warnings] .[concat_null_yields_null] ,ER.[transaction_isolation_level] ,ER.[lock_timeout] ,ER.[deadlock_priority] ,ER.[row_count] ,ER.[prev_error] ,ER.[nest_level] ,ER.[granted_query_memory] ,.[granted_query_memory]. executing_managed_code] ,ER.[group_id] ,ER.[query_hash] ,ER.[query_plan_hash] ,EC.[most_recent_session_id] ,EC.[connect_time] ,EC.[net_transport] ,EC.[protocol_type] ,EC.[protocol_version] ,EC.[endpoint_id] ,EC.[encrypt_option] ,EC.[auth_scheme] ,EC.[node_afinity] ,EC.[num_reads] ,EC.[num_writes] ,EC.[last_read] ,EC.[last_write] ,EC.[net_packet_size] ,EC.[client_net_address] ,EC.[client_tcp_port] ,EC.[local_net_address] ,EC.[local_tcp_port] , .[parent_connection_id] ,EC.[most_recent_sql_handle] ,ES.[host_process_id] ,ES.[client_version] ,ES.[client_interface_name] ,ES.[security_id] ,ES.[login_name] ,ES.[nt_domain] ,ES.[ nt_user_name] ,ES.[memory_usage] ,ES.[total_scheduled_time] ,ES.[last_request_start_time] ,ES.[last_request_end_time] ,ES.[is_user_process] ,ES.[original_security_id] ,ES_last_cess_su_login.[ES_name]st_lo]. ,ES.[last_unsuccessful_logon] ,ES.[unsuccessful_logons] ,ES.[authenticating_database_id] ,ER.[sql_handle] ,ER.[statement_start_offset] ,ER.[statement_end_offset] ,ER.[plan_handle] ,ER.[databasce_e] ,.[coatabasce_e].[coatabasce] ,ER.[sql_handle] , ES.[идентификатор_на_база_данни]) като [идентификатор_на_база_данни] ,ER.[user_id] ,ER.[идентификатор_на_връзка] от s. ys.dm_exec_requests ER с(readuncommitted) дясно присъединяване sys.dm_exec_sessions ES с(readuncommitted) на ES.session_id =ER.session_id ляво присъединяване sys.dm_exec_connections EC с(readuncommitted) на EC.session_id като изберете ES. [session_id] ,[blocking_session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[percent_complete] ,[DBName] ,[TSQL] ,[QueryPlan] ,[wait_type] ,[login_time] ,[host_name] ] ,[име_на_програма] ,[време_на_изчакване] ,[последен_тип_на_изчакване] ,[изчакване_ресурс] ,[брой_отворени_транзакции] ,[брой_на_открити_резултати] ,[идентификатор_на_транзакция] ,[контекст_информация] ,[приблизително_време_на_завършване] ,[време_на_завършено_време] ,[ред_време_на_завършване_],______________ [адрес_задача],[четене],[записване],[логически_четения],[размер_текст],[език],[формат_дата],[първа_дата],[идентификатор на цитати],[arithabort],[ansi_null_dflt_ on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority], [deadlock_priority],[stedlock_priority],[stred_quer_meer],[row_count_velry] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[protocol_version] ,[protocol_version] ,[endpoint_me], [thi_me] [endpoint] node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_net_address] ,[local_net_address] ,[local_net_address] ,[local_net_address] ,[local_net_address] ,[ost. ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[ sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[database_id] ,[user_id] ,[connection_id] от tbl0 където [status] в ('suspended', 'running', 'runnable') ( изберете [blocking_session_id] от tbl, където [blocking_session_id]<>0 група от [blocking_session_id]) изберете [session_id] , [blocking_session_id] , [request_id] , [start_time] , [status] , [command] , [percent_complete] DBName] ,[TSQL] ,[QueryPlan] ,[wait_type] ,[login_time] ,[host_name] ,[program_name] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transa ction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[reads] ,[size][text_write] ,[език] ,[format_date] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_padding], [ansi_padding] ,[null_conields],[ansi_conell] lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_hash] ,[query_plan],[query_plan_hash],[query_plan_hash]report,[most_net_] ,[тип_протокол] ,[версия_на_протокол] ,[идентификатор_на_крайна точка] ,[опция_шифроване] ,[схема_авторизация] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_net_address],[local_net_address],[local_net_address],[local_net_address],[local_net_address],[local_net_address_],[local_net_address_,q rent_cent][dle_cent] host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time],[total_scheduled_time] ,[start_scheduled_time]. ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[database_id] ,[user_id] ,[connection_id]from tblunion allselect tbl0.[id_session] ,tbl0.[blocking_session_id] ,tbl0.[request_id] ,tbl0.[ start_time] ,tbl0.[status] ,tbl0.[command] ,tbl0.[percent_complete] ,tbl0.[DBName] ,tbl0.[TSQL] ,tbl0.[QueryPlan] ,tbl0.[wait_type] ,tbl0.[login_time] ,tbl0.[host_name] ,tbl0.[program_name] ,tbl0.[wait_time] ,tbl0.[last_wait_type] ,tbl0.[wait_resource] ,tbl0.[open_transaction_count] ,tbl0.[open_resultset_count] ,tbl0].[transaction_0].[transaction_0]. .[context_info] ,tbl0.[estimated_completion_time] ,tbl0.[cpu_time] ,tbl0.[total_elapsed_time] ,tbl0.[scheduler_id] ,tbl0.[task_address] ,tbl0.[reads] ,tbl0.[writes] ,tbl0.[ logical_reads] ,tbl0.[text_size] ,tbl0.[language] ,tbl0.[date_format] ,tbl0.[date_first] ,tbl0.[quoted_identifier] ,tbl0.[arithabort] ,tbl0.[ansi_null_dflt_on] ,tbl0.[ansi_defaults] ,tbl0.[ansi_warnings] ,tbl0.[ansi_padding] ,tbl0.[ansi_nulls] ,tbl0.[concat_null_yields_null] ,tbl0.[transaction_isolation_level] ,tbl0.[lock_timeout] ,tbl0.[deadlock_priority] ,tbl0.[row_count] ,tbl0.[prev_error] ,tbl0.[nest_level] ,tbl0.[granted_query_memory] ,tbl0.[executing_managed_code] ,tbl0.[group_id] ,tbl0.[query_hash] ,tbl0.[query_plan_hash] ,tbl0.[most_recent_session_id] ,tbl0.[connect_time] ,tbl0.[net_transport] ,tbl0.[protocol_type] ,tbl0.[protocol_version] ,tbl0.[endpoint_id] ,tbl0.[encrypt_option] ,tbl0.[auth_scheme] ,tbl0.[node_affinity] ,tbl0.[num_reads] ,tbl0.[num_writes] ,tbl0.[last_read] ,tbl0.[last_write] ,tbl0.[net_packet_size] ,tbl0.[client_net_address] ,tbl0.[client_tcp_port] ,tbl0.[local_net_address] ,tbl0.[local_tcp_port] ,tbl0.[parent_connection_id] ,tbl0.[most_recent_sql_handle] ,tbl0.[host_process_id] ,tbl0.[client_version] ,tbl0.[client_interface_name] ,tbl0.[se curity_id] ,tbl0.[login_name] ,tbl0.[nt_domain] ,tbl0.[nt_user_name] ,tbl0.[memory_usage] ,tbl0.[total_scheduled_time] ,tbl0.[last_request_start_time] ,tbl0.[last_request_end_time] ,tbl0.[is_user_process] ,tbl0.[original_security_id] ,tbl0.[original_login_name] ,tbl0.[last_successful_logon] ,tbl0.[last_unsuccessful_logon] ,tbl0.[unsuccessful_logons] ,tbl0.[authenticating_database_id] ,tbl0.[sql_handle] ,tbl0.[statement_start_offset] ,tbl0.[statement_end_offset] ,tbl0.[plan_handle] ,tbl0.[database_id] ,tbl0.[user_id] ,tbl0.[connection_id]from tbl_group as tginner join tbl0 on tg.blocking_session_id=tbl0.session_id;GO

    [/expand]

To take a snapshot of active queries and save it to the tables described above, create a stored procedure:

Example of implementing a stored procedure to collect snapshots of active queries

[expand title=”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[AutoStatisticsActiveRequests]ASBEGIN SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; declare @tbl0 table ( [SQLHandle] [varbinary](64) NOT NULL, [TSQL] [nvarchar](max) NULL ); declare @tbl1 table ( [PlanHandle] [varbinary](64) NOT NULL, [SQLHandle] [varbinary](64) NOT NULL, [QueryPlan] [xml] NULL ); declare @tbl2 table ( [session_id] [smallint] NOT NULL, [request_id] [int] NULL, [start_time] [datetime] NULL, [status] [nvarchar](30) NULL, [command] [nvarchar](32) NULL, [sql_handle] [varbinary](64) NULL, [statement_start_offset] [int] NULL, [statement_end_offset] [int] NULL, [plan_handle] [varbinary](64) NULL, [database_id] [smallint] NULL, [user_id] [int] NULL, [connection_id] [uniqueidentifier] NULL, [blocking_session_id] [smallint] NULL, [wait_type] [nvarchar](60) NULL, [wait_time] [int] NULL, [last_wait_type] [nvarchar](60) NULL, [wait_resource] [nvarchar](256) NULL, [open_transaction_count] [int] NULL, [open_resultset_count] [int] NULL, [transaction_id] [bigint] NULL, [context_info] [varbinary](128) NULL, [percent_complete] [real] NULL, [estimated_completion_time] [bigint] NULL, [cpu_time] [int] NULL, [total_elapsed_time] [int] NULL, [scheduler_id] [int] NULL, [task_address] [varbinary](8) NULL, [reads] [bigint] NULL, [writes] [bigint] NULL, [logical_reads] [bigint] NULL, [text_size] [int] NULL, [language] [nvarchar](128) NULL, [date_format] [nvarchar](3) NULL, [date_first] [smallint] NULL, [quoted_identifier] [bit] NULL, [arithabort] [bit] NULL, [ansi_null_dflt_on] [bit] NULL, [ansi_defaults] [bit] NULL, [ansi_warnings] [bit] NULL, [ansi_padding] [bit] NULL, [ansi_nulls] [bit] NULL, [concat_null_yields_null] [bit] NULL, [transaction_isolation_level] [smallint] NULL, [lock_timeout] [int] NULL, [deadlock_priority] [int] NULL, [row_count] [bigint] NULL, [prev_error] [int] NULL, [nest_level] [int] NULL, [granted_query_memory] [int] NULL, [executing_managed_code] [bit] NULL, [group_id] [int] NULL, [query_hash] [binary](8) NULL, [query_plan_hash] [binary](8) NULL, [most_recent_session_id] [int] NULL, [connect_time] [datetime] NULL, [net_transport] [nvarchar](40) NULL, [protocol_type] [nvarchar](40) NULL, [protocol_version] [int] NULL, [endpoint_id] [int] NULL, [encrypt_option] [nvarchar](40) NULL, [auth_scheme] [nvarchar](40) NULL, [node_affinity] [smallint] NULL, [num_reads] [int] NULL, [num_writes] [int] NULL, [last_read] [datetime] NULL, [last_write] [datetime] NULL, [net_packet_size] [int] NULL, [client_net_address] [varchar](48) NULL, [client_tcp_port] [int] NULL, [local_net_address] [varchar](48) NULL, [local_tcp_port] [int] NULL, [parent_connection_id] [uniqueidentifier] NULL, [most_recent_sql_handle] [varbinary](64) NULL, [login_time] [datetime] NULL, [host_name] [nvarchar](128) NULL, [program_name] [nvarchar](128) NULL, [host_process_id] [int] NULL, [client_version] [int] NULL, [client_interface_name] [nvarchar](32) NULL, [security_id] [varbinary](85) NULL, [login_name] [nvarchar](128) NULL, [nt_domain] [nvarchar](128) NULL, [nt_user_name] [nvarchar](128) NULL, [memory_usage] [int] NULL, [total_scheduled_time] [int] NULL, [last_request_start_time] [datetime] NULL, [last_request_end_time] [datetime] NULL, [is_user_process] [bit] NULL, [original_security_id] [varbinary](85) NULL, [original_login_name] [nvarchar](128) NULL, [last_successful_logon] [datetime] NULL, [last_unsuccessful_logon] [datetime] NULL, [unsuccessful_logons] [bigint] NULL, [authenticating_database_id] [int] NULL, [TSQL] [nvarchar](max) NULL, [QueryPlan] [xml] NULL ); insert into @tbl2 ( [session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[sql_handle] ,[TSQL] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[QueryPlan] ,[database_id] ,[user_id] ,[connection_id] ,[blocking_session_id] ,[wait_type] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[percent_complete] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[login_time] ,[host_name] ,[program_name] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ) select [session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[sql_handle] ,[TSQL] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[QueryPlan] ,[database_id] ,[user_id] ,[connection_id] ,[blocking_session_id] ,[wait_type] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[percent_complete] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[login_time] ,[host_name] ,[program_name] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] from [inf].[vRequestDetail]; insert into @tbl1 ( [PlanHandle], [SQLHandle], [QueryPlan] ) select [plan_handle], [sql_handle], (select top(1) [query_plan] from sys.dm_exec_query_plan([plan_handle])) as [QueryPlan] from @tbl2 where (select top(1) [query_plan] from sys.dm_exec_query_plan([plan_handle])) is not null group by [plan_handle], [sql_handle]; insert into @tbl0 ( [SQLHandle], [TSQL] ) select [sql_handle], (select top(1) text from sys.dm_exec_sql_text([sql_handle])) as [TSQL]--[query_text] from @tbl2 where (select top(1) text from sys.dm_exec_sql_text([sql_handle])) is not null group by [sql_handle];;merge [srv].[SQLQuery] as trg using @tbl0 as src on trg.[SQLHandle]=src.[SQLHandle] WHEN NOT MATCHED BY TARGET THEN INSERT ( [SQLHandle], [TSQL] ) VALUES ( src.[SQLHandle], src.[TSQL] );;merge [srv].[PlanQuery] as trg using @tbl1 as src on trg.[SQLHandle]=src.[SQLHandle] and trg.[PlanHandle]=src.[PlanHandle] WHEN NOT MATCHED BY TARGET THEN INSERT ( [PlanHandle], [SQLHandle], [QueryPlan] ) VALUES ( src.[PlanHandle], src.[SQLHandle], src.[QueryPlan] ); select [session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[sql_handle] ,(select top(1) 1 from @tbl0 as t where t.[SQLHandle]=tt.[sql_handle]) as [TSQL] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,(select top(1) 1 from @tbl1 as t where t.[PlanHandle]=tt.[plan_handle]) as [QueryPlan] ,[database_id] ,[user_id] ,[connection_id] ,[blocking_session_id] ,[wait_type] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[percent_complete] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[login_time] ,[host_name] ,[program_name] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] into #ttt from @tbl2 as tt group by [session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[sql_handle] ,[TSQL] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[database_id] ,[user_id] ,[connection_id] ,[blocking_session_id] ,[wait_type] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[percent_complete] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[login_time] ,[host_name] ,[program_name] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id]; UPDATE trg SET trg.[status] =case when (trg.[status]<>'suspended') then coalesce(src.[status] collate DATABASE_DEFAULT, trg.[status] collate DATABASE_DEFAULT) else trg.[status] end --,trg.[command] =coalesce(src.[command] collate DATABASE_DEFAULT, trg.[command] collate DATABASE_DEFAULT) --,trg.[sql_handle] =coalesce(src.[sql_handle] , trg.[sql_handle] ) --,trg.[TSQL] =coalesce(src.[TSQL] collate DATABASE_DEFAULT, trg.[TSQL] collate DATABASE_DEFAULT) ,trg.[statement_start_offset] =coalesce(src.[statement_start_offset] , trg.[statement_start_offset] ) ,trg.[statement_end_offset] =coalesce(src.[statement_end_offset] , trg.[statement_end_offset] ) --,trg.[plan_handle] =coalesce(src.[plan_handle] , trg.[plan_handle] ) --,trg.[QueryPlan] =coalesce(src.[QueryPlan] , trg.[QueryPlan] ) --,trg.[connection_id] =coalesce(src.[connection_id] , trg.[connection_id] ) ,trg.[blocking_session_id] =coalesce(trg.[blocking_session_id] , src.[blocking_session_id] ) ,trg.[wait_type] =coalesce(trg.[wait_type] collate DATABASE_DEFAULT, src.[wait_type] collate DATABASE_DEFAULT) ,trg.[wait_time] =coalesce(src.[wait_time] , trg.[wait_time] ) ,trg.[last_wait_type] =coalesce(src.[last_wait_type] collate DATABASE_DEFAULT, trg.[last_wait_type] collate DATABASE_DEFAULT) ,trg.[wait_resource] =coalesce(src.[wait_resource] collate DATABASE_DEFAULT, trg.[wait_resource] collate DATABASE_DEFAULT) ,trg.[open_transaction_count] =coalesce(src.[open_transaction_count] , trg.[open_transaction_count] ) ,trg.[open_resultset_count] =coalesce(src.[open_resultset_count] , trg.[open_resultset_count] ) --,trg.[transaction_id] =coalesce(src.[transaction_id] , trg.[transaction_id] ) ,trg.[context_info] =coalesce(src.[context_info] , trg.[context_info] ) ,trg.[percent_complete] =coalesce(src.[percent_complete] , trg.[percent_complete] ) ,trg.[estimated_completion_time] =coalesce(src.[estimated_completion_time] , trg.[estimated_completion_time] ) ,trg.[cpu_time] =coalesce(src.[cpu_time] , trg.[cpu_time] ) ,trg.[total_elapsed_time] =coalesce(src.[total_elapsed_time] , trg.[total_elapsed_time] ) ,trg.[scheduler_id] =coalesce(src.[scheduler_id] , trg.[scheduler_id] ) ,trg.[task_address] =coalesce(src.[task_address] , trg.[task_address] ) ,trg.[reads] =coalesce(src.[reads] , trg.[reads] ) ,trg.[writes] =coalesce(src.[writes] , trg.[writes] ) ,trg.[logical_reads] =coalesce(src.[logical_reads] , trg.[logical_reads] ) ,trg.[text_size] =coalesce(src.[text_size] , trg.[text_size] ) ,trg.[language] =coalesce(src.[language] collate DATABASE_DEFAULT, trg.[language] collate DATABASE_DEFAULT) ,trg.[date_format] =coalesce(src.[date_format] , trg.[date_format] ) ,trg.[date_first] =coalesce(src.[date_first] , trg.[date_first] ) ,trg.[quoted_identifier] =coalesce(src.[quoted_identifier] , trg.[quoted_identifier] ) ,trg.[arithabort] =coalesce(src.[arithabort] , trg.[arithabort] ) ,trg.[ansi_null_dflt_on] =coalesce(src.[ansi_null_dflt_on] , trg.[ansi_null_dflt_on] ) ,trg.[ansi_defaults] =coalesce(src.[ansi_defaults] , trg.[ansi_defaults] ) ,trg.[ansi_warnings] =coalesce(src.[ansi_warnings] , trg.[ansi_warnings] ) ,trg.[ansi_padding] =coalesce(src.[ansi_padding] , trg.[ansi_padding] ) ,trg.[ansi_nulls] =coalesce(src.[ansi_nulls] , trg.[ansi_nulls] ) ,trg.[concat_null_yields_null] =coalesce(src.[concat_null_yields_null] , trg.[concat_null_yields_null] ) ,trg.[transaction_isolation_level] =coalesce(src.[transaction_isolation_level] , trg.[transaction_isolation_level] ) ,trg.[lock_timeout] =coalesce(src.[lock_timeout] , trg.[lock_timeout] ) ,trg.[deadlock_priority] =coalesce(src.[deadlock_priority] , trg.[deadlock_priority] ) ,trg.[row_count] =coalesce(src.[row_count] , trg.[row_count] ) ,trg.[prev_error] =coalesce(src.[prev_error] , trg.[prev_error] ) ,trg.[nest_level] =coalesce(src.[nest_level] , trg.[nest_level] ) ,trg.[granted_query_memory] =coalesce(src.[granted_query_memory] , trg.[granted_query_memory] ) ,trg.[executing_managed_code] =coalesce(src.[executing_managed_code] , trg.[executing_managed_code] ) ,trg.[group_id] =coalesce(src.[group_id] , trg.[group_id] ) ,trg.[query_hash] =coalesce(src.[query_hash] , trg.[query_hash] ) ,trg.[query_plan_hash] =coalesce(src.[query_plan_hash] , trg.[query_plan_hash] ) ,trg.[most_recent_session_id] =coalesce(src.[most_recent_session_id] , trg.[most_recent_session_id] ) ,trg.[connect_time] =coalesce(src.[connect_time] , trg.[connect_time] ) ,trg.[net_transport] =coalesce(src.[net_transport] collate DATABASE_DEFAULT, trg.[net_transport] collate DATABASE_DEFAULT) ,trg.[protocol_type] =coalesce(src.[protocol_type] collate DATABASE_DEFAULT, trg.[protocol_type] collate DATABASE_DEFAULT) ,trg.[protocol_version] =coalesce(src.[protocol_version] , trg.[protocol_version] ) ,trg.[endpoint_id] =coalesce(src.[endpoint_id] , trg.[endpoint_id] ) ,trg.[encrypt_option] =coalesce(src.[encrypt_option] collate DATABASE_DEFAULT, trg.[encrypt_option] collate DATABASE_DEFAULT) ,trg.[auth_scheme] =coalesce(src.[auth_scheme] collate DATABASE_DEFAULT, trg.[auth_scheme] collate DATABASE_DEFAULT) ,trg.[node_affinity] =coalesce(src.[node_affinity] , trg.[node_affinity] ) ,trg.[num_reads] =coalesce(src.[num_reads] , trg.[num_reads] ) ,trg.[num_writes] =coalesce(src.[num_writes] , trg.[num_writes] ) ,trg.[last_read] =coalesce(src.[last_read] , trg.[last_read] ) ,trg.[last_write] =coalesce(src.[last_write] , trg.[last_write] ) ,trg.[net_packet_size] =coalesce(src.[net_packet_size] , trg.[net_packet_size] ) ,trg.[client_net_address] =coalesce(src.[client_net_address] collate DATABASE_DEFAULT, trg.[client_net_address] collate DATABASE_DEFAULT) ,trg.[client_tcp_port] =coalesce(src.[client_tcp_port] , trg.[client_tcp_port] ) ,trg.[local_net_address] =coalesce(src.[local_net_address] collate DATABASE_DEFAULT, trg.[local_net_address] collate DATABASE_DEFAULT) ,trg.[local_tcp_port] =coalesce(src.[local_tcp_port] , trg.[local_tcp_port] ) ,trg.[parent_connection_id] =coalesce(src.[parent_connection_id] , trg.[parent_connection_id] ) ,trg.[most_recent_sql_handle] =coalesce(src.[most_recent_sql_handle] , trg.[most_recent_sql_handle] ) ,trg.[login_time] =coalesce(src.[login_time] , trg.[login_time] ) ,trg.[host_name] =coalesce(src.[host_name] collate DATABASE_DEFAULT, trg.[host_name] collate DATABASE_DEFAULT) ,trg.[program_name] =coalesce(src.[program_name] collate DATABASE_DEFAULT, trg.[program_name] collate DATABASE_DEFAULT) ,trg.[host_process_id] =coalesce(src.[host_process_id] , trg.[host_process_id] ) ,trg.[client_version] =coalesce(src.[client_version] , trg.[client_version] ) ,trg.[client_interface_name] =coalesce(src.[client_interface_name] collate DATABASE_DEFAULT, trg.[client_interface_name] collate DATABASE_DEFAULT) ,trg.[security_id] =coalesce(src.[security_id] , trg.[security_id] ) ,trg.[login_name] =coalesce(src.[login_name] collate DATABASE_DEFAULT, trg.[login_name] collate DATABASE_DEFAULT) ,trg.[nt_domain] =coalesce(src.[nt_domain] collate DATABASE_DEFAULT, trg.[nt_domain] collate DATABASE_DEFAULT) ,trg.[nt_user_name] =coalesce(src.[nt_user_name] collate DATABASE_DEFAULT, trg.[nt_user_name] collate DATABASE_DEFAULT) ,trg.[memory_usage] =coalesce(src.[memory_usage] , trg.[memory_usage] ) ,trg.[total_scheduled_time] =coalesce(src.[total_scheduled_time] , trg.[total_scheduled_time] ) ,trg.[last_request_start_time] =coalesce(src.[last_request_start_time] , trg.[last_request_start_time] ) ,trg.[last_request_end_time] =coalesce(src.[last_request_end_time] , trg.[last_request_end_time] ) ,trg.[is_user_process] =coalesce(src.[is_user_process] , trg.[is_user_process] ) ,trg.[original_security_id] =coalesce(src.[original_security_id] , trg.[original_security_id] ) ,trg.[original_login_name] =coalesce(src.[original_login_name] collate DATABASE_DEFAULT, trg.[original_login_name] collate DATABASE_DEFAULT) ,trg.[last_successful_logon] =coalesce(src.[last_successful_logon] , trg.[last_successful_logon] ) ,trg.[last_unsuccessful_logon] =coalesce(src.[last_unsuccessful_logon] , trg.[last_unsuccessful_logon] ) ,trg.[unsuccessful_logons] =coalesce(src.[unsuccessful_logons] , trg.[unsuccessful_logons] ) ,trg.[authenticating_database_id] =coalesce(src.[authenticating_database_id] , trg.[authenticating_database_id] ) from [srv].[RequestStatistics] as trg inner join #ttt as src on (trg.[session_id]=src.[session_id]) and (trg.[request_id]=src.[request_id]) and (trg.[database_id]=src.[database_id]) and (trg.[user_id]=src.[user_id]) and (trg.[start_time]=src.[start_time]) and (trg.[command] collate DATABASE_DEFAULT=src.[command] collate DATABASE_DEFAULT) and ((trg.[sql_handle]=src.[sql_handle] and src.[sql_handle] IS NOT NULL) or (src.[sql_handle] IS NULL)) and ((trg.[plan_handle]=src.[plan_handle] and src.[plan_handle] IS NOT NULL) or (src.[plan_handle] IS NULL)) and (trg.[transaction_id]=src.[transaction_id]) and ((trg.[connection_id]=src.[connection_id] and src.[connection_id] IS NOT NULL) or (src.[connection_id] IS NULL)); UPDATE trg SET trg.[EndRegUTCDate]=GetUTCDate() from [srv].[RequestStatistics] as trg where not exists( select top(1) 1 from #ttt as src where (trg.[session_id]=src.[session_id]) and (trg.[request_id]=src.[request_id]) and (trg.[database_id]=src.[database_id]) and (trg.[user_id]=src.[user_id]) and (trg.[start_time]=src.[start_time]) and (trg.[command] collate DATABASE_DEFAULT=src.[command] collate DATABASE_DEFAULT) and ((trg.[sql_handle]=src.[sql_handle] and src.[sql_handle] IS NOT NULL) or (src.[sql_handle] IS NULL)) and ((trg.[plan_handle]=src.[plan_handle] and src.[plan_handle] IS NOT NULL) or (src.[plan_handle] IS NULL)) and (trg.[transaction_id]=src.[transaction_id]) and ((trg.[connection_id]=src.[connection_id] and src.[connection_id] IS NOT NULL) or (src.[connection_id] IS NULL)) ); INSERT into [srv].[RequestStatistics] ([session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[sql_handle] --,[TSQL] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] --,[QueryPlan] ,[database_id] ,[user_id] ,[connection_id] ,[blocking_session_id] ,[wait_type] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[percent_complete] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[login_time] ,[host_name] ,[program_name] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id]) select src.[session_id] ,src.[request_id] ,src.[start_time] ,src.[status] ,src.[command] ,src.[sql_handle] --,src.[TSQL] ,src.[statement_start_offset] ,src.[statement_end_offset] ,src.[plan_handle] --,src.[QueryPlan] ,src.[database_id] ,src.[user_id] ,src.[connection_id] ,src.[blocking_session_id] ,src.[wait_type] ,src.[wait_time] ,src.[last_wait_type] ,src.[wait_resource] ,src.[open_transaction_count] ,src.[open_resultset_count] ,src.[transaction_id] ,src.[context_info] ,src.[percent_complete] ,src.[estimated_completion_time] ,src.[cpu_time] ,src.[total_elapsed_time] ,src.[scheduler_id] ,src.[task_address] ,src.[reads] ,src.[writes] ,src.[logical_reads] ,src.[text_size] ,src.[language] ,src.[date_format] ,src.[date_first] ,src.[quoted_identifier] ,src.[arithabort] ,src.[ansi_null_dflt_on] ,src.[ansi_defaults] ,src.[ansi_warnings] ,src.[ansi_padding] ,src.[ansi_nulls] ,src.[concat_null_yields_null] ,src.[transaction_isolation_level] ,src.[lock_timeout] ,src.[deadlock_priority] ,src.[row_count] ,src.[prev_error] ,src.[nest_level] ,src.[granted_query_memory] ,src.[executing_managed_code] ,src.[group_id] ,src.[query_hash] ,src.[query_plan_hash] ,src.[most_recent_session_id] ,src.[connect_time] ,src.[net_transport] ,src.[protocol_type] ,src.[protocol_version] ,src.[endpoint_id] ,src.[encrypt_option] ,src.[auth_scheme] ,src.[node_affinity] ,src.[num_reads] ,src.[num_writes] ,src.[last_read] ,src.[last_write] ,src.[net_packet_size] ,src.[client_net_address] ,src.[client_tcp_port] ,src.[local_net_address] ,src.[local_tcp_port] ,src.[parent_connection_id] ,src.[most_recent_sql_handle] ,src.[login_time] ,src.[host_name] ,src.[program_name] ,src.[host_process_id] ,src.[client_version] ,src.[client_interface_name] ,src.[security_id] ,src.[login_name] ,src.[nt_domain] ,src.[nt_user_name] ,src.[memory_usage] ,src.[total_scheduled_time] ,src.[last_request_start_time] ,src.[last_request_end_time] ,src.[is_user_process] ,src.[original_security_id] ,src.[original_login_name] ,src.[last_successful_logon] ,src.[last_unsuccessful_logon] ,src.[unsuccessful_logons] ,src.[authenticating_database_id] from #ttt as src where not exists( select top(1) 1 from [srv].[RequestStatistics] as trg where (trg.[session_id]=src.[session_id]) and (trg.[request_id]=src.[request_id]) and (trg.[database_id]=src.[database_id]) and (trg.[user_id]=src.[user_id]) and (trg.[start_time]=src.[start_time]) and (trg.[command] collate DATABASE_DEFAULT=src.[command] collate DATABASE_DEFAULT) and ((trg.[sql_handle]=src.[sql_handle] and src.[sql_handle] IS NOT NULL) or (src.[sql_handle] IS NULL)) and ((trg.[plan_handle]=src.[plan_handle] and src.[plan_handle] IS NOT NULL) or (src.[plan_handle] IS NULL)) and (trg.[transaction_id]=src.[transaction_id]) and ((trg.[connection_id]=src.[connection_id] and src.[connection_id] IS NOT NULL) or (src.[connection_id] IS NULL)) ); drop table #ttt;ENDGO

[/expand]

It is possible to automate the collection process. For example, if we add a call to this stored procedure with a schedule to the Agent task (for example, every 10 seconds) or by event (for example, [Databases]. [Active Transactions]. [_ Total]> 0).

At the end of the day, we perform a general analysis and save the result to the table calling the stored procedure.

Implementation of the table

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[IndicatorStatistics]( [execution_count] [bigint] NOT NULL, [max_total_elapsed_timeSec] [decimal](38, 6) NOT NULL, [max_total_elapsed_timeLastSec] [decimal](38, 6) NOT NULL, [DATE] [date] NOT NULL, CONSTRAINT [PK_IndicatorStatistics] PRIMARY KEY CLUSTERED ( [DATE] ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GO

Implementation of the stored procedure

[expand title=”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[AutoStatisticsTimeRequests]ASBEGIN SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; delete from [srv].[TSQL_DAY_Statistics] where [DATE]<=DateAdd(day,-180,GetUTCDate()); INSERT INTO [srv].[TSQL_DAY_Statistics] ([command] ,[DBName] ,[PlanHandle] ,[SqlHandle] ,[execution_count] ,[min_wait_timeSec] ,[min_estimated_completion_timeSec] ,[min_cpu_timeSec] ,[min_total_elapsed_timeSec] ,[min_lock_timeoutSec] ,[max_wait_timeSec] ,[max_estimated_completion_timeSec] ,[max_cpu_timeSec] ,[max_total_elapsed_timeSec] ,[max_lock_timeoutSec] ,[DATE]) SELECT [command] ,[DBName] ,[plan_handle] ,[sql_handle] ,count(*) as [execution_count] ,min([wait_timeSec]) as [min_wait_timeSec] ,min([estimated_completion_timeSec]) as [min_estimated_completion_timeSec] ,min([cpu_timeSec]) as [min_cpu_timeSec] ,min([total_elapsed_timeSec]) as [min_total_elapsed_timeSec] ,min([lock_timeoutSec]) as [min_lock_timeoutSec] ,max([wait_timeSec]) as [max_wait_timeSec] ,max([estimated_completion_timeSec]) as [max_estimated_completion_timeSec] ,max([cpu_timeSec]) as [max_cpu_timeSec] ,max([total_elapsed_timeSec]) as [max_total_elapsed_timeSec] ,max([lock_timeoutSec]) as [max_lock_timeoutSec] ,cast([InsertUTCDate] as [DATE]) as [DATE] FROM [srv].[vRequestStatistics] with(readuncommitted) where cast([InsertUTCDate] as date) =DateAdd(day,-1,cast(GetUTCDate() as date)) and [command] in ( 'UPDATE', 'TRUNCATE TABLE', 'SET OPTION ON', 'SET COMMAND', 'SELECT INTO', 'SELECT', 'NOP', 'INSERT', 'EXECUTE', 'DELETE', 'DECLARE', 'CONDITIONAL', 'BULK INSERT', 'BEGIN TRY', 'BEGIN CATCH', 'AWAITING COMMAND', 'ASSIGN', 'ALTER TABLE' ) and [database_id] in ( /*a list of tracked databases through DB_ID(‘database_name’)*/ ) and [DBName] is not null group by [command] ,[DBName] ,[plan_handle] ,[sql_handle] ,cast([InsertUTCDate] as [DATE]); declare @inddt int=1;;with tbl11 as ( select [SqlHandle], max([max_total_elapsed_timeSec]) as [max_total_elapsed_timeSec] ,min([max_total_elapsed_timeSec]) as [min_max_total_elapsed_timeSec] ,avg([max_total_elapsed_timeSec]) as [avg_max_total_elapsed_timeSec] ,sum([execution_count]) as [execution_count] from [srv].[TSQL_DAY_Statistics] where [max_total_elapsed_timeSec]>=0.001 and [DATE]=0.001 and [DATE]=cast(DateAdd(day,[email protected],cast(GetUTCDate() as date)) as date) group by [SqlHandle], [DATE] ) , tbl1_sum as (select sum([execution_count]) as [sum_execution_count] from tbl11) , tbl1_total as ( select (select [sum_execution_count] from tbl1_sum) as [execution_count] , sum(tbl11.[max_total_elapsed_timeSec]*tbl11.[execution_count])/(select [sum_execution_count] from tbl1_sum) as [max_total_elapsed_timeSec] , sum(tbl12.[max_total_elapsed_timeSec]*tbl11.[execution_count])/(select [sum_execution_count] from tbl1_sum) as [max_total_elapsed_timeLastSec] , tbl12.[DATE] from tbl11 inner join tbl12 on tbl11.[SqlHandle]=tbl12.[SqlHandle] group by tbl12.[DATE] ) INSERT INTO [srv].[IndicatorStatistics] ([DATE] ,[execution_count] ,[max_total_elapsed_timeSec] ,[max_total_elapsed_timeLastSec] ) select t1.[DATE] ,t1.[execution_count] ,t1.[max_total_elapsed_timeSec] ,t1.[max_total_elapsed_timeLastSec] from tbl1_total as t1; declare @dt datetime=DateAdd(day,-2,GetUTCDate()); INSERT INTO [srv].[RequestStatisticsArchive] ([session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[database_id] ,[user_id] ,[connection_id] ,[blocking_session_id] ,[wait_type] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[percent_complete] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[login_time] ,[host_name] ,[program_name] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[InsertUTCDate] ,[EndRegUTCDate]) SELECT [session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[database_id] ,[user_id] ,[connection_id] ,[blocking_session_id] ,[wait_type] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[percent_complete] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[login_time] ,[host_name] ,[program_name] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[InsertUTCDate] ,[EndRegUTCDate] FROM [srv].[RequestStatistics] where [InsertUTCDate] 

[/expand]

As you can see, the stored procedure also removes data from the [srv]. [RequestStatistics] table to prevent its expansion and ensure quick snapshots of active queries.

We can create this stored procedure during daily Agent calls at the end of the day.

Now, move to the very analysis of the collected data. To compare the current database state to the previous period, use the following view.

Implementation of the view

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE view [srv].[vIndicatorStatistics] asSELECT [DATE] ,[execution_count] ,[max_total_elapsed_timeSec] ,[max_total_elapsed_timeLastSec] ,[max_total_elapsed_timeLastSec]-[max_total_elapsed_timeSec] as [DiffSnapshot] ,([max_total_elapsed_timeLastSec]-[max_total_elapsed_timeSec])*100/[max_total_elapsed_timeSec] as [% Snapshot] , case when ([max_total_elapsed_timeLastSec]<[max_total_elapsed_timeSec]) then N'IMPROVED' else case when ([max_total_elapsed_timeLastSec]>[max_total_elapsed_timeSec]) then N'WORSENED' else N'IS NOT CHANGED' end end as 'IndicatorSnapshot' FROM [srv].[IndicatorStatistics]GO

To compare the current database state to the specific day, execute the following query:

with tbl1 as ( select min(total_elapsed_timeSec) as [MIN], max(total_elapsed_timeSec) as [MAX], avg(total_elapsed_timeSec) as [AVG], [sql_handle], count(*) as [Count], '2017-11-01' as [DATE] from [srv].[vRequestStatisticsArchive] where [start_time] between '2017-11-01T07:00:00' and '2017-11-01T21:00:00' group by [sql_handle]), tbl2 as ( select min(total_elapsed_timeSec) as [MIN], max(total_elapsed_timeSec) as [MAX], avg(total_elapsed_timeSec) as [AVG], [sql_handle], count(*) as [Count], '2017-11-08' as [DATE] from [srv].[vRequestStatistics] where [start_time] between '2017-11-08T07:00:00' and '2017-11-08T21:00:00' group by [sql_handle])select coalesce(tbl1.[sql_handle], tbl2.[sql_handle]) as [sql_handle], coalesce(tbl1.[MIN], 0) as [MIN 01.11.2017], coalesce(tbl2.[MIN], 0) as [MIN 08.11.2017], coalesce(tbl1.[MAX], 0) as [MAX 01.11.2017], coalesce(tbl2.[MAX], 0) as [MAX 08.11.2017], coalesce(tbl1.[AVG], 0) as [AVG 01.11.2017], coalesce(tbl2.[AVG], 0) as [AVG 08.11.2017], coalesce(tbl1.[Count], 0) as [Count 01.11.2017], coalesce(tbl2.[Count], 0) as [Count 08.11.2017]from tbl1left outer join tbl2 on tbl1.[sql_handle]=tbl2.[sql_handle];GO

Here, we compare the performance from 07-00 to 21-00 on November 1 and 8, 2017 (for example, it is the working time of the enterprise to exclude the analysis of the routine tasks).

We can generate this upload as a detailed report and attach it to the general report obtained from the [srv]. [VIndicatorStatistics] view.

To understand how the query was executed and what happened from time to time, it’s enough to use the [srv]. [vRequestStatistics] view with the filter by [start_time] (the date and time of the request received).

Резюме

In this article, we considered an example of implementing a general MS SQL Server performance indicator, which allows determining the database state related to the previous period or a specific day. As a metric, we used total elapsed time.

This method is universal. It is necessary to configure it, up to your needs, as well as to determine the measure, such as what we will collect and compare.

In addition, this approach allows detecting the issue immediately or for a certain period.

With the received data, it is possible to create a robot that would make decisions what queries to improve or disable to prevent system bottlenecks and notifications of administrators.


  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 Server - SQL Server / T-SQL урок, част 54

  2. Как да получите всички таблици, които имат ограничение за първичен ключ, създадени в база данни на SQL Server - SQL Server / TSQL Урок 57

  3. Вземете текущата часова зона на сървъра в SQL Server (T-SQL)

  4. 6 начина за проверка на размера на база данни в SQL Server с помощта на T-SQL

  5. Актуализиране на стъпка на задание за задача на агент на SQL Server (T-SQL)