Introduktion
Det finns ofta ett behov av att skapa en prestationsindikator som visar databasaktivitet relaterad till föregående period eller specifik dag. I artikeln med titeln "Implementering av SQL Server Performance Indicator for Queries, Stored Procedures and Triggers", gav vi ett exempel på hur denna indikator implementeras.
I den här artikeln kommer vi att beskriva ett annat enkelt sätt att spåra hur och hur lång tid frågekörningen tar, samt hur man hämtar exekveringsplaner för varje tidpunkt.
Den här metoden är särskilt användbar i de fall du behöver generera dagliga rapporter, så du kan inte bara automatisera metoden utan även lägga till den i rapporten med minimala tekniska detaljer.
I den här artikeln kommer vi att undersöka ett exempel på hur den här vanliga prestationsindikatorn implementeras där Total förfluten tid kommer att fungera som ett mått.
Lösning
Först tillhandahåller vi en allmän algoritm:
1) Ta en ögonblicksbild av aktiva frågor
2) Spara resultatet
3) Utför en allmän analys och spara resultatet i en tabell i slutet av dagen
4) Gör en jämförande analys av de mottagna uppgifterna
Nu ska vi ge lite detaljer.
För att ta en ögonblicksbild av aktiva frågor, skapa följande tabeller:
- Tabell över frågeplaner
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[PlanQuery]( [PlanHandle] [varinary](64) INTE NULL, [SQLHandle](6) [4) NULL, [QueryPlan] [xml] NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_PlanQuery] PRIMÄRNYCKEL CLUSTERED ( [SQLHandle] ASC, [PlanHandle] ASC) MED (PAD_INDEX =AV, STATISTICS_OFF, IGN. , ALLOW_ROW_LOCKS =PÅ, ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMÄR]) PÅ [PRIMÄR] TEXTIMAGE_PÅ [PRIMÄR]MÅLTABELL [srv].[PlanQuery] LÄGG TILL BEGRÄNSNING [DF_PlanQuery_Infoga UTCDate] DEFAULTCAD(preutcIndate)>
- Tabell över frågor
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[SQLQuery]( [SQLHandle] [varbinary](64) INTE NULL, [TSQL] [nvarchar],(max) NULL] [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_SQLQuery] PRIMÄRNYCKEL KLUSTERAD ( [SQLHandle] ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOWS_ROWON) [ALLOWS_ROWON_) [ALLOWS_ROWON_] [PRIMARY] TEXTIMAGE_ON [PRIMARY]MÅLTABELL [srv].[SQLQuery] LÄGG TILL BEGRÄNSNING [DF_SQLQuery_InsertUTCDate] DEFAULT (getutcdate()) FÖR [InsertUTCDate]GO
- Tabell med ögonblicksbilder av aktiva frågor:
[expand title=”Code”]ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[RequestStatistics]( [session_id] [smallint] INTE NULL, [request_id] [int] NULL, [status]_NULL, [datum] nvarchar](30) NULL, [kommando] [nvarchar](32) NULL, [sql_handle] [varbinary](64) NULL, [statement_start_offset] [int] NULL, [statement_end_offset] [int] NULL, [plan_handle] [variant ](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, [uppgiftsadress] [varbinary](8) NULL, [läser] [bigint] NULL, [skriver] [bigint] NULL, [logical_reads] [bigint] NULL, [text_size] [int] NULL, [språk] [nvarchar](128) NULL, [datumformat] [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] 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, [senast_läst] [datumtid] 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 ] [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, [senaste_begäran_tid] 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] [bigint_authentica] [bigint_authentica] ] NULL, [InsertUTCDate] [datetime] NOT NULL, [EndRegUTCDate] [datetime] NULL) PÅ [PRIMARY]GOALTER TABELL [srv].[RequestStatistics] LÄGG TILL BEGRÄNSNING [DF_RequestStatistics_InsertUTCDate] DEFAULT (getutcInställ) (getutcInge) ONGOCREATE CLUSTERED INDEX [indRequest] PÅ [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 =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, ONLINE =OFF, ALLOW_ROW_LOCKRYOWS_ON, ALLOW_ROW_LOCKRYOWS_PON, ALLOW_ROW_LOCKRYOWS_PON ANSI_PADDING ONGOCREATE ONCLUSTERED INDEX [indPlanQuery] PÅ [srv].[RequestStatistics]( [plan_handle ] ASC, [sql_handle] ASC)WHERE ([sql_handle] ÄR INTE NULL OCH [plan_handle] ÄR INTE NULL)MED (PAD_INDEX =AV, STATISTICS_NORECOMPUTE =AV, SORT_IN_TEMPDB =AV, DROP_EXISTING =FRÅN, PÅ, ONALLLINE ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMARY]GO
[/expand]
På liknande sätt skapar vi en tabell för arkivet [srv].[RequestStatisticsArchive].
- Tabell med total daglig statistik
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABELL [srv].[TSQL_DAY_Statistics]( [kommando] [nvarchar](32) INTE NULL, [DB](128) 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] [decimal](23, 8) NOT NULL, [min_cpu_timeSec] [decimal](23, 8) NOT NULL, [min_total_elapsed_timeSec] [decimal](23, 8) NOT NULLoutmalSec][3decimal] , 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, 8) NOT NULL_S ] [decimal](23, 8) NOT NULL, [max_lock_timeoutSec] [decimal](23, 8) NOT NULL, [DATE] [date] NOT NULL) PÅ [PRIMÄR]MÅLTABELL [srv].[TSQL_DAY_Statistics] LÄGG TILL BEGRÄNSNING [DF_TSQL_DAY_Statistics_DATE] DEFAULT (getutcdate()) FÖR [DATUM]SKAPA ICKE-KLUSTRET INDEX [indDATE] PÅ [srv].[TSQL_DAY_Statistics]( [DATE] ASC) MED (PAD_INDEX =AV, STATISTICS_NORECOMPUTE =AV, SORT_IN_TEMPDB =AV, DROP_EXISTING =AV, FRÅN, LÅNGT, LÅNGT =PÅ) PÅ [PRIMARY]GO
- Visa genom inspelade ögonblicksbilder av aktiva frågor
[expand title=”Code”]ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE visa [srv].[vRequestStatistics] som/*fråga statistik*/SELECT rs.[status] sortera Cyrillic_General_CI_AS som [status], ,rs. ] ,rs.[kommando] sammanställ Cyrillic_General_CI_AS som [kommando] ,rs.[session_id] ,rs.[blocking_session_id] ,round(cast(rs.[total_elapsed_time] som decimal(18,3))/1000, 3) som [ total_elapsed_timeSec] ,DB_NAME(rs.[databas_id]) sortera Cyrillic_General_CI_AS som [DBName] ,rs.[is_user_process] ,rs.[login_name] sammanställa Cyrillic_General_CI_AS som [login_name] ,rs.[login_programic_name]AS. [host_name] sortera Cyrillic_General_CI_AS som [host_name] ,sq.[TSQL] sortera Cyrillic_General_CI_AS som [TSQL]--,(välj top(1) text från sys.dm_exec_sql_text([sql_handle]) ery, [TSQL]Plan ] ,rs.[plan_handle] ,rs.[user_id] ,rs.[connection_id] ,rs.[databas_id] ,rs.[sql_handle] ,rs.[ statement_start_offset]--Antalet tecken i det körande paketet eller den lagrade proceduren där den aktuella satsen körs. Den kan användas tillsammans med dynamiska hanteringsfunktioner, såsom sql_handle, statement_end_offset och sys.dm_exec_sql_text för att hämta den för närvarande körande satsen för frågan. NULL-värden är tillåtna. ,rs.[statement_end_offset]--Antalet tecken i det körande paketet eller den lagrade proceduren, där den aktuella satsen slutfördes. Den kan användas tillsammans med dynamiska hanteringsfunktioner, såsom sql_handle, statement_end_offset och sys.dm_exec_sql_text för att hämta den för närvarande körande satsen för frågan. NULL-värden är tillåtna. ,rs.[wait_type] sortera Cyrillic_General_CI_AS som [wait_type]--waiting type ,rs.[wait_time]--Om frågan för närvarande är blockerad, innehåller kolumnen väntetid (i ms). NULL-värden är inte tillåtna. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] sortera Cyrillic_General_CI_AS som [last_wait_type]--Om frågan blockerades tidigare, kolumnen innehåller typen av senaste väntetid. NULL-värden är inte tillåtna. ,rs.[wait_resource] sortera Cyrillic_General_CI_AS som [wait_resource]--Om frågan för närvarande är blockerad, anger kolumnen resursen för vilken frågan väntar på att släppas. NULL-värden är inte tillåtna. ,rs.[open_transaction_count]--Antalet transaktioner som är tillgängliga för den här frågan. NULL-värden är inte tillåtna. ,rs.[open_resultset_count]--Antalet resulterande uppsättningar tillgängliga för den givna frågan. NULL-värden är inte tillåtna. ,rs.[transaction_id]--En transaktionsidentifierare för den aktuella frågan. NULL-värden är inte tillåtna. ,rs.[context_info] ,rs.[percent_complete] ,rs.[estimated_completion_time] ,round(cast(rs.[estimated_completion_time] as decimal(18,3))/1000, 3) as [estimated_completion_timeSec.[cpurs.] ,rs. ]--CPU-tid (i ms) som spenderas på att köra frågan. NULL-värden är inte tillåtna. ,round(cast(rs.[cpu_time] as decimal(18,3))/1000, 3) as [cpu_timeSec] ,rs.[total_elapsed_time]--Total tid som förflutit sedan begäran togs emot (i ms). NULL-värden är inte tillåtna. ,rs.[scheduler_id]--En identifierare för schemaläggaren som planerar den givna frågan. NULL-värden är inte tillåtna. ,rs.[task_address]--adressen till minnesblocket som är dedikerat till uppgiften som är relevant för denna begäran. NULL-värden är tillåtna. ,rs.[reads]--Antalet läsningar som utförs av den givna frågan. NULL-värden är tillåtna. ,rs.[writes]--Antalet skrivningar som utförs av den givna frågan. NULL-värden är inte tillåtna. ,rs.[logical_reads]--Antalet logiska läsningar som utförs av den givna frågan. NULL-värden är inte tillåtna. ,rs.[text_size]--Ställa in parametern TEXTSIZE för den givna frågan. NULL-värden är inte tillåtna. ,rs.[språk] sortera Cyrillic_General_CI_AS som [språk]--Ange ett språk för den givna frågan. NULL-värden är tillåtna. ,rs.[date_format] sortera Cyrillic_General_CI_AS som [date_format]--Ställa in DATEFORMAT-parametern för den givna frågan. NULL-värden är tillåtna. ,rs.[date_first]--Ställer in parametern DATEFIRST för den givna frågan. NULL-värden är inte tillåtna. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rsn_ull[ansi_nulls] ,rsn_ull. .[transaction_isolation_level]--transaktionsisoleringsnivå för den givna frågan. NULL-värden är inte tillåtna (0 är inte specificerad, 1 – 5 värden anges i stigande ordning för transaktionsisoleringsnivån). ,rs.[lock_timeout]--Lås timeout för den givna frågan (i ms). NULL-värden är inte tillåtna. ,round(cast(rs.[lock_timeout] som decimal(18,3))/1000, 3) som [lock_timeoutSec] ,rs.[deadlock_priority]--Värdet för parametern DEADLOCK_PRIORITY för den givna frågan. NULL-värden är inte tillåtna. ,rs.[row_count]--Antalet rader som returneras till klienten för denna fråga. NULL-värden är inte tillåtna. ,rs.[prev_error]--Föregående fel inträffade när frågan kördes. NULL-värden är inte tillåtna. ,rs.[nest_level]--Den aktuella nivån för kodkapslingsnivå som exekveras för den givna frågan. NULL-värden är inte tillåtna. ,rs.[granted_query_memory]--Antalet sidor för att köra frågan. NULL-värden är inte tillåtna. ,rs.[executing_managed_code]--anger om den givna frågan för närvarande exekverar CLR-objektkoden (till exempel procedur, typ eller trigger). Denna växling ställs in när CLR-objektet är i stacken, även när Transact-SQL-koden anropas från miljön. NULL-värden är inte tillåtna. ,rs.[group_id]--ID för arbetsbelastningsgruppen som denna fråga tillhör. NULL-värden är inte tillåtna. ,rs.[query_hash]--Binärt hash-värde beräknas för frågan och används för att identifiera frågor med liknande logik. Det är möjligt att använda frågehash för att bestämma användningen av statistikresurser för frågor som endast skiljer sig åt i sina bokstavliga värden. ,rs.[query_plan_hash]--Binärt hash-värde beräknas för frågeexekveringsplanen och används för att identifiera liknande exekveringsplaner. Det är möjligt att använda planhash för att hitta den totala frågekostnaden med liknande exekveringsplaner. ,rs.[last_request_starttime] ,rs.[last_request_end_time] ,rs.[total_scheduled_time] ,rs.[memory_usage] ,rs.[nt_user_name] collate Cyrillic_General_CI_AS as [nt_rs_a. .[security_id] ,rs.[client_interface_name] sortera Cyrillic_General_CI_AS som [client_interface_name] ,rs.[client_version] ,rs.[host_process_id] ,rs.[login_time] ,rs.[most_recent_sql_handtag]_sql_handtag] local_tcp_port] ,rs.[local_net_address] sortera Cyrillic_General_CI_AS som [local_net_address] ,rs.[client_tcp_port] ,rs.[client_net_address] sortera Cyrillic_General_CI_AS som [client_net_address] [Eng_Regs.CD] [client_net_address] readuncommitted) inre join [srv].[PlanQuery] som pq på rs.[plan_handle]=pq.[PlanHandle] och rs.[sql_handle]=pq.[SqlHandle] inner join [srv].[SQLQuery] som sq på sq .[SqlHandle]=pq.[SqlHandle] union all 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] som deci )/1000, 3) as [total_elapsed_timeSec] ,DB_NAME(rs.[databas_id]) collate Cyrillic_General_CI_AS as [DBName] ,rs.[is_user_process] ,rs.[login_name] collate Cyrillic_General_CI_AS.Crillic_General_CI_AS. [host_name] sortera Cyrillic_General_CI_AS ,sq.[TSQL] sortera Cyrillic_General_CI_AS--,(välj top(1) text från sys.dm_exec_sql_text([sql_handle])) som [TSQL], pq.[handle]QueryPlan.,[plan rs.[användar-id] ,rs.[anslutnings-id] ,rs.[databas_id] ,rs.[sql_handle] ,rs.[statement_start_offset]--Antalet tecken i det körande paketet eller den lagrade proceduren där den aktuella satsen körs . Den kan användas tillsammans med de dynamiska hanteringsfunktionerna, såsom sql_handle, statement_end_offset och sys.dm_exec_sql_text för att få den för närvarande körande satsen för frågan. NULL-värden är tillåtna. ,rs.[statement_end_offset]--Antalet tecken i det körande paketet eller den lagrade proceduren där den aktuella satsen slutfördes. Den kan användas tillsammans med dynamiska hanteringsfunktioner, såsom sql_handle, statement_end_offset och sys.dm_exec_sql_text för att hämta den för närvarande körande satsen för frågan. NULL-värden är tillåtna. ,rs.[wait_type] collate Cyrillic_General_CI_AS--waiting type ,rs.[wait_time]--Om frågan för närvarande är blockerad, innehåller kolumnen den aktuella väntetiden (i ms). NULL-värden är tillåtna. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] collate Cyrillic_General_CI_AS--Om frågan blockerades tidigare, innehåller kolumnen typen av den senaste väntan. NULL-värden är inte tillåtna. ,rs.[wait_resource] collate Cyrillic_General_CI_AS--Om frågan för närvarande är blockerad, innehåller kolumnen resursen för vilken frågan väntar på att släppas. NULL-värden är inte tillåtna. ,rs.[open_transaction_count]--Antalet transaktioner som är tillgängliga för den givna frågan. NULL-värden är inte tillåtna. ,rs.[open_resultset_count]--Antalet resulterande uppsättningar tillgängliga för den givna frågan. NULL-värden är inte tillåtna. ,rs.[transaction_id]--Identifierare för transaktionen där frågan exekveras. NULL-värden är inte tillåtna. ,rs.[context_info] ,rs.[percent_complete] ,rs.[estimated_completion_time] ,round(cast(rs.[estimated_completion_time] as decimal(18,3))/1000, 3) as [estimated_completion_timeSec.[cpurs.] ,rs. ]--CPU-tid (i ms) som spenderas på exekveringen av frågan. NULL-värden är inte tillåtna. ,round(cast(rs.[cpu_time] as decimal(18,3))/1000, 3) as [cpu_timeSec] ,rs.[total_elapsed_time]--Total tid som förflutit sedan begäran togs emot (i ms). NULL-värden är inte tillåtna. ,rs.[scheduler_id]--Identifierare för schemaläggaren som planerar den givna frågan. NULL-värden är inte tillåtna. ,rs.[uppgiftsadress]--Adressen till minnesblocket dedikerat till uppgiften relaterad till denna fråga. NULL-värden är tillåtna. ,rs.[reads]--Antalet läsningar som utförs av den givna frågan. NULL-värden är inte tillåtna. ,rs.[writes]--Antalet skrivningar som utförs av den givna frågan. NULL-värden är inte tillåtna. ,rs.[logical_reads]--Antalet logiska läsningar som utförs av den givna frågan. NULL-värden är inte tillåtna. ,rs.[text_size]--Ställa in parametern TEXTSIZE för den givna frågan. NULL-värden är inte tillåtna. ,rs.[language] collate Cyrillic_General_CI_AS--Ställer in språket för den givna frågan. NULL-värden är tillåtna. ,rs.[date_format] collate Cyrillic_General_CI_AS--Ställer in parametern DATEFORMAT för den givna frågan. NULL-värden är tillåtna. ,rs.[date_first]--Ställer in parametern DATEFIRST för den givna frågan. NULL-värden är inte tillåtna. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rsn_ull[ansi_nulls] ,rsn_ull. .[transaction_isolation_level]--Isolationsnivå som skapades tillsammans med transaktionen för den givna frågan. NULL-värden är inte tillåtna (0 är inte specificerad, 1 - 5 värden sätts stigande transaktionsisoleringsnivån). ,rs.[lock_timeout]--Lås timeout för den givna frågan (i ms). NULL-värden är inte tillåtna. ,round(cast(rs.[lock_timeout] som decimal(18,3))/1000, 3) som [lock_timeoutSec] ,rs.[deadlock_priority]--Värde för parametern DEADLOCK_PRIORITY för den givna frågan. NULL-värdet är inte tillåtet. ,rs.[row_count]--Antal rader som returneras till klienten för den givna frågan. NULL-värdet är inte tillåtet. ,rs.[prev_error]--Föregående fel inträffade när frågan kördes. NULL-värden är inte tillåtna. ,rs.[nest_level]--Den aktuella kodkapslingsnivån som exekveras för den givna frågan. NULL-värdet är inte tillåtet. ,rs.[granted_query_memory]--Antalet sidor för att köra frågan. NULL-värdet är inte tillåtet. ,rs.[executing_managed_code] -- indikerar om den givna frågan för närvarande exekverar CLR-objektkoden (till exempel procedur, typ eller trigger). Denna växling ställs in under tiden när CLR-objektet är i stacken, även när Transact-SQL-koden anropas från miljön. NULL-värden är inte tillåtna. ,rs.[group_id]--ID för arbetsbelastningsgruppen som denna fråga tillhör. NULL-värden är inte tillåtna. ,rs.[query_hash]--Binärt hash-värde beräknas för frågan och används för att identifiera frågor med liknande logik. Det är möjligt att använda frågehash för att bestämma användningen av statistikresurser för frågor som endast skiljer sig åt i sina bokstavliga värden. ,rs.[query_plan_hash]--Binärt hash-värde beräknas för frågeexekveringsplanen och används för att identifiera liknande exekveringsplaner. Det är möjligt att använda planhash för att hitta den totala frågekostnaden med liknande exekveringsplaner. ,rs.[senaste_begäran_starttid] ,rs.[sista_begäran_sluttid] ,rs.[total_scheduled_time] ,rs.[minnesanvändning] ,rs.[nt_user_name] collate Cyrillic_General_CI_AS ,rs._Clate _curr. client_interface_name] sortera 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]_tcrs,_CI_net-dress] Cyrillic .[client_tcp_port] ,rs.[client_net_address] sortera Cyrillic_General_CI_AS ,rs.[EndRegUTCDate] FRÅN [srv].[RequestStatisticsArchive] som rs med(readocommitted) inner join [srv] as.[Plan_onQurery].[Plan_onQurery pq.[PlanHandle] och rs.[sql_handle]=pq.[SqlHandle] inre join [srv].[SQLQuery] som sq on sq.[SqlHandle]=pq.[SqlHandle]GO
[/expand]
- Visa efter urval av aktuella aktiva förfrågningar:
[expand title=”Code”]ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE visa [inf].[vRequestDetail] som/*aktiv, redo att köras och väntande frågor, såväl som de som explicit blockerar andra sessioner */med tbl0 som ( välj ES .[session_id] ,ER.[blocking_session_id] ,ER.[request_id] ,ER.[starttid] ,ER.[status] ,ER.[kommando] ,ER.[percent_complete] ,DB_Name(coalesce(ER.[databas_id]) , ES.[database_id])) som [DBName] ,(välj top(1) text från sys.dm_exec_sql_text(ER.[sql_handle])) som [TSQL] ,(välj top(1) [query_plan] från sys.dm_exec_query_plan (ER.[plan_handle])) som [QueryPlan] ,ER.[väntetyp] ,ES.[login_tid] ,ES.[värdnamn] ,ES.[programnamn] ,ER.[väntetid] ,ER.[sista_vänte_typ] ,ER .[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.[läser] ,ER.[skriver] ,ER.[logical_reads] ,ER.[text_size] ,ER.[språk] ,ER.[date_format] ,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. .[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_ERmor. executing_managed_code] ,ER.[grupp-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_affinity] ,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.[domän] ,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.n ,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] .[databas-id](ER) , ES.[database_id]) som [database_id] ,ER.[user_id] ,ER.[connection_id] från s ys.dm_exec_requests ER with(readuncommitted) right join sys.dm_exec_sessions ES with(readuncommitted) on ES.session_id =ER.session_id left join sys.dm_exec_connections EC with(readuncommitted) on EC.session_id =select. [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_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[cpu_total_time] _du [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] ,[förhandsräknare] ,_morgondag,_morgon. ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[me,]_option,_uth node_affinity] ,[antal_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] [local_tcp_port],_cp ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain]; sql_handle],[statement_start_offset],[statement_end_offset] ,[plan_handle] ,[databas_id],[användar-id] ,[anslutnings-id] från tbl0 där [status] i ('suspended', 'running', 'runnable')), tbl_group as ( välj [blocking_session_id] från tbl där [blocking_session_id]<>0 gruppera efter [blocking_session_id]) välj [session_id],[blocking_session_id],[request_id],[starttid] ,[status] ,[kommando] ,[percent,_complete] . DBName],[TSQL],[QueryPlan],[väntetyp] ,[inloggningstid] ,[värdnamn] ,[programnamn] ,[väntetid] ,[sista_vänte_typ] ,[vänte_resurs] ,[öppen_transa ction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] , [logiska,_ ,[språk] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls_nulls_nulls] ,_nulls_nulls_n,_nulls_nulls_n,_nulls_nulls_n,_nulls_n,_nulls] lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[mest_sessionsid] _[connect_time] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[antal_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_net_address] ,[föräldraanslutningen]_tcp] host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[senaste_begäran] _sista_begäran] _senaste_gångs-id,_sist_gångsförfrågan] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle],[statement_start_offset] ,[statement_end_plan_offset_connect] ,[fackföreningsid] ,[fackföreningsid] ,[fackföreningsid] allselect tbl0.[session_id] ,tbl0.[blocking_session_id] ,tbl0.[request_id] ,tbl0.[ start_time] ,tbl0.[status] ,tbl0.[kommando] ,tbl0.[percent_complete] ,tbl0.[DBName] ,tbl0.[TSQL] ,tbl0.[QueryPlan] ,tbl0.[wait_type] ,tbl0.[login_time] ,tbl0.[värdnamn] ,tbl0.[programnamn] ,tbl0.[väntetid] ,tbl0.[sista_vänte_typ] ,tbl0.[vänta_resurs] ,tbl0.[öppet_transaktionsantal] ,tbl0.[antal_öppet_resultatuppsättning] ,tbl0.[,tbl0. .[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; STÄLL IN TRANSAKTIONSISOLERINGSNIVÅ LÄS OENGAGERAD; 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] NU LL, [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] [bin ary](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] NUL L, [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_reque st_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_nul l_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] ,[c lient_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_hand le] ) --,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 DATABA SE_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_wa rnings] =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] =coal esce(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_p ort] ,[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.[state ment_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; STÄLL IN TRANSAKTIONSISOLERINGSNIVÅ LÄS OENGAGERAD; 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) , t bl1_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_con nection_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_er ror] ,[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]GOTo 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];GOHere, 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).
Sammanfattning
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.