sql >> Database teknologi >  >> RDS >> Sqlserver

Implementering af en fælles MS SQL Server Performance Indicator

Introduktion

Der er ofte behov for at oprette en præstationsindikator, der viser databaseaktivitet relateret til den foregående periode eller specifik dag. I artiklen med titlen "Implementering af SQL Server Performance Indicator for Queries, Stored Procedures and Triggers", gav vi et eksempel på implementering af denne indikator.

I denne artikel vil vi beskrive en anden enkel måde at spore, hvordan og hvor lang tid udførelse af forespørgsler tager, samt hvordan man henter eksekveringsplaner for hvert tidspunkt.

Denne metode er især nyttig i de tilfælde, hvor du har brug for at generere daglige rapporter, så du ikke kun kan automatisere metoden, men også tilføje den til rapporten med et minimum af tekniske detaljer.

I denne artikel vil vi udforske et eksempel på implementering af denne fælles præstationsindikator, hvor samlet forløbet tid vil tjene som en metrisk.

Løsning

Først giver vi en generel algoritme:

1) Tag et øjebliksbillede af aktive forespørgsler
2) Gem resultatet
3) Udfør en generel analyse og gem resultatet i en tabel sidst på dagen
4) Lav en sammenlignende analyse af de modtagne data

Nu skal vi give nogle detaljer.

For at tage et øjebliksbillede af aktive forespørgsler skal du oprette følgende tabeller:

  1. Tabel over forespørgselsplaner
    BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABEL [srv].[PlanQuery]( [PlanHandle] [varbinary](64) IKKE NULL, [SQL-Håndter](6) [4) NULL, [QueryPlan] [xml] NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_PlanQuery] PRIMÆR NØGLE KLUSTERET ( [SQLHandle] ASC, [PlanHandle] ASC) MED (PAD_INDEX =OFF, STATISTICS_OFF, IGNPUNKTER =OFF, IGN. , ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABEL [srv].[PlanQuery] TILFØJ BEGRÆNSNING [DF_PlanQuery_InsertUTCDate] DEFAULTcdate (preGOUTcdate)> 
  2. Tabel over forespørgsler
    BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABEL [srv].[SQLQuery]( [SQLHandle] [varbinary](64) IKKE NULL, [TSQL] [nvarchar] [nvarchar] [InsertUTCDate] [datetime] IKKE NULL, BEGRÆNSNING [PK_SQLQuery] PRIMÆR NØGLE KLUSTERET ( [SQLHandle] ASC) MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW ON, ALLOWS_ROW_ON) [ALLOW_ROW_ON] [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [srv].[SQLQuery] TILFØJ BEGRÆNSNING [DF_SQLQuery_InsertUTCDate] STANDARD (getutcdate()) FOR [InsertUTCDate]GO
  3. Tabel med øjebliksbilleder af aktive forespørgsler:
    [expand title=”Kode”]

    BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[RequestStatistics]( [session_id] [smallint] IKKE NULL, [request_id] [int] NULL, [start]_time] [dato] 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] [smalint] 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] [variabel](128) NULL, [percent_complete] [real] NULL, [estimeret_fuldførelsestid] [bigint] NULL, [cpu_time] [int] NULL, [total_elapsed_time] [int] NULL, [planlægger_id] int] NULL, [opgaveadresse] [variant](8) NULL, [læser] [bigint] NULL, [skriver] [bigint] NULL, [logical_reads] [bigint] NULL, [tekststørrelse] [int] NULL, [sprog] [nvarchar](128) NULL, [datoformat] [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_advarsler] [ bit] NULL, [ansi_padding] [bit] NULL, [ansi_nulls] [bit] NULL, [concat_null_yields_null] [bit] NULL, [transaction_isolation_level] [smalint] 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] [binær](8) NULL, [query_plan_hash] [binær](8) NULL, [most_recent_session_id] [int] NULL, [connect_time] [datetime] NULL, [net_transport] [nvarchar](40) NULL, [ protocol_type] [nvarchar](40) NULL, [protokolversion] [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, [sidste_læst] [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 ] [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_brugernavn] [nvarchar](128) NULL, [memory_usage] [int] NULL, [total_scheduled_time] [int] NULL, [last_request_time]_time] [last_request_end_time] [datetime] NULL, [er_user_process] [bit] NULL, [original_sec urity_id] [varbinary](85) NULL, [original_login_name] [nvarchar](128) NULL, [sidste_successful_logon] [datetime] NULL, [sidste_unsuccessful_logon] [datetime] NULL, [unsuccessful_logons] [bigint_authenting] [bigint-database] ] NULL, [InsertUTCDate] [datetime] NOT NULL, [EndRegUTCDate] [datetime] NULL) PÅ [PRIMARY]GOALTER TABEL [srv].[RequestStatistics] TILFØJ BEGRÆNSNING [DF_RequestStatistics_InsertUTCDate] STANDARD(GÅT)UTCINDSÆT [GODDAN] 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 =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, ONLINE =OFF, ALLOW_ROW_LOCKRYOWS_ON, ALLOW_ROW_LOCKRYOWS_ ON) ANSI_PADDING ONGOCREATE IKKE-KLUSTERET INDEX [indPlanQuery] PÅ [srv].[RequestStatistics]( [plan_handle ] ASC, [sql_handle] ASC) WHERE ([sql_handle] ER IKKE NULL OG [plan_handle] ER IKKE NULL) MED (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, _ONALLOWS =OFF, _ONALL ALLOW_PAGE_LOCKS =TIL) PÅ [PRIMARY]GO

    [/udvid]

    På lignende måde opretter vi en tabel til arkivet [srv].[RequestStatisticsArchive].

  4. Tabel med samlet daglig statistik
    BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABEL [srv].[TSQL_DAY_Statistics]( [kommando] [nvarchar](32) IKKE 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](lock) , 8) IKKE 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) IKKE NULL, [max_lock_timeoutSec] [decimal](23, 8) IKKE NULL, [DATE] [dato] IKKE NULL) PÅ [PRIMÆR]GOALTERTABEL [srv].[TSQL_DAY_Statistics] TILFØJ BEGRÆNSNING [DF_TSQL_DAY_Statistics_DATE] DEFAULT (getutcdate()) FOR [DATO]OPRET IKKE-KLYNGERET INDEKS [indDATO] PÅ [srv].[TSQL_DAY_Statistics]( [DATE] ASC)MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, SORT_IN_TEMPDB =FRA, DROP_EXISTING =OFF, OFF, OFF, OFF, OFF. =TIL) PÅ [PRIMARY]GO
  5. Se efter optagede øjebliksbilleder af aktive forespørgsler
    [expand title=”Kode”]

    BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE visning [srv].[vRequestStatistics] som/*forespørgselsstatistik*/SELECT rs.[status] sæt Cyrillic_General_CI_AS som [status] ,rs. ] ,rs.[command] collate Cyrillic_General_CI_AS som [command] ,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.[database_id]) collate Cyrillic_General_CI_AS som [DBName] ,rs.[is_user_process] ,rs.[login_name] collate Cyrillic_General_CI_AS as [login_name] _rill_name]AS. [host_name] sæt Cyrillic_General_CI_AS som [host_name] ,sq.[TSQL] collate Cyrillic_General_CI_AS som [TSQL]--,(vælg top(1) tekst fra sys.dm_exec_sql_text([sql_handle]) ery, [TSQL]Qu ] ,rs.[plan_handle] ,rs.[bruger_id] ,rs.[connection_id] ,rs.[database_id] ,rs.[sql_handle] ,rs.[ statement_start_offset]--Antallet af tegn i den aktuelt eksekverende pakke eller lagrede procedure, hvori den aktuelle sætning køres. Det kan bruges sammen med dynamiske administrationsfunktioner, såsom sql_handle, statement_end_offset og sys.dm_exec_sql_text for at få den aktuelt eksekverende sætning for forespørgslen. NULL-værdier er tilladt. ,rs.[statement_end_offset]--Antallet af tegn i den aktuelt eksekverende pakke eller lagrede procedure, hvori den aktuelle sætning blev fuldført. Det kan bruges sammen med dynamiske administrationsfunktioner, såsom sql_handle, statement_end_offset og sys.dm_exec_sql_text for at få den aktuelt eksekverende sætning for forespørgslen. NULL-værdier er tilladt. ,rs.[wait_type] collate Cyrillic_General_CI_AS som [wait_type]--waiting type ,rs.[wait_time]--Hvis forespørgslen i øjeblikket er blokeret, indeholder kolonnen ventetid (i ms). NULL-værdier er ikke tilladt. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] collate Cyrillic_General_CI_AS as [last_wait_type]--Hvis forespørgslen blev blokeret tidligere, kolonnen indeholder typen af ​​seneste ventetid. NULL-værdier er ikke tilladt. ,rs.[wait_resource] collate Cyrillic_General_CI_AS som [wait_resource]--Hvis forespørgslen i øjeblikket er blokeret, angiver kolonnen den ressource, som forespørgslen venter på at blive frigivet for. NULL-værdier er ikke tilladt. ,rs.[open_transaction_count]--Antallet af transaktioner, der er tilgængelige for denne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[open_resultset_count]--Antallet af resulterende sæt tilgængelige for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[transaction_id]--En transaktions-id for den aktuelt eksekverende forespørgsel. NULL-værdier er ikke tilladt. ,rs.[kontekst_info] ,rs.[percent_completion] ,rs.[estimeret_fuldførelsestid] ,round(cast(rs.[estimeret_færdigelsestid] som decimal(18,3))/1000, 3) som [estimeret_færdiggørelsestidSek.] ,rs. ]--CPU-tid (i ms) brugt på at udføre forespørgslen. NULL-værdier er ikke tilladt. ,round(cast(rs.[cpu_tid] som decimal(18,3))/1000, 3) som [cpu_timeSec] ,rs.[total_elapsed_time]--samlet tid, der er gået siden anmodningen blev modtaget (i ms). NULL-værdier er ikke tilladt. ,rs.[scheduler_id]--En identifikator for planlæggeren, der planlægger den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[task_address]--adressen på hukommelsesblokken dedikeret til den opgave, der er relevant for denne anmodning. NULL-værdier er tilladt. ,rs.[reads]--Antallet af læsninger udført af den givne forespørgsel. NULL-værdier er tilladt. ,rs.[skriver]--Antallet af skrivninger udført af den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[logical_reads]--Antallet af logiske læsninger udført af den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[text_size]--Indstilling af parameteren TEXTSIZE for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[language] collate Cyrillic_General_CI_AS som [language]--Indstilling af et sprog for den givne forespørgsel. NULL-værdier er tilladt. ,rs.[date_format] collate Cyrillic_General_CI_AS som [date_format]--Indstilling af DATEFORMAT parameteren for den givne forespørgsel. NULL-værdier er tilladt. ,rs.[date_first]--Indstilling af DATEFIRST-parameteren for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_advarsler] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs_ull. .[transaction_isolation_level]--transaktionsisolationsniveau for den givne forespørgsel. NULL-værdier er ikke tilladt (0 er ikke angivet, 1 – 5 værdier er angivet i stigende rækkefølge af transaktionsisolationsniveauet). ,rs.[lock_timeout]--Lås timeout for den givne forespørgsel (i ms). NULL-værdier er ikke tilladt. ,round(cast(rs.[lock_timeout] som decimal(18,3))/1000, 3) som [lock_timeoutSec] ,rs.[deadlock_priority]--værdien af ​​DEADLOCK_PRIORITY parameteren for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[row_count]--Antallet af rækker, der returneres til klienten for denne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[prev_error]--Der opstod en tidligere fejl under udførelse af forespørgslen. NULL-værdier er ikke tilladt. ,rs.[nest_level]--Det aktuelle niveau af kode-nesting-niveau udført for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[granted_query_memory]--Antallet af sider, der skal udføres forespørgslen. NULL-værdier er ikke tilladt. ,rs.[executing_managed_code]--angiver, om den givne forespørgsel i øjeblikket udfører CLR-objektkoden (f.eks. procedure, type eller trigger). Denne skifte er indstillet, når CLR-objektet er i stakken, selv når Transact-SQL-koden kaldes fra miljøet. NULL-værdier er ikke tilladt. ,rs.[group_id]--ID for arbejdsbelastningsgruppen, som denne forespørgsel tilhører. NULL-værdier er ikke tilladt. ,rs.[query_hash]--Binær hash-værdi beregnes for forespørgslen og bruges til at identificere forespørgsler med lignende logik. Det er muligt at bruge forespørgselshash til at bestemme brugen af ​​statistiske ressourcer for de forespørgsler, der kun adskiller sig i deres bogstavelige værdier. ,rs.[query_plan_hash]--Binær hash-værdi beregnes for forespørgselsudførelsesplanen og bruges til at identificere lignende eksekveringsplaner. Det er muligt at bruge plan-hash til at finde de samlede forespørgselsomkostninger med lignende udførelsesplaner. ,rs.[sidste_anmodning_starttid] ,rs.[sidste_anmodning_sluttid] ,rs.[samlet_planlagt_tid] ,rs.[hukommelsesbrug] ,rs.[nt_brugernavn] samle Cyrillisk_General_CI_AS som [nt_bruger_navn] _gæld. .[security_id] ,rs.[client_interface_name] samle Cyrillic_General_CI_AS som [client_interface_name] ,rs.[client_version] ,rs.[host_process_id] ,rs.[login_time] ,rs.[most_recent_sql_handle]_,rs_handle local_tcp_port] ,rs.[local_net_address] collate Cyrillic_General_CI_AS as [local_net_address] ,rsr.[client_tcp_port] ,rs.[client_net_address] collate Cyrillic_General_CI_AS som [client_net_address] readuncommitted) indre join [srv].[PlanQuery] som pq på rs.[plan_handle]=pq.[PlanHandle] og rs.[sql_handle]=pq.[SqlHandle] indre join [srv].[SQLQuery] som sq på sq .[SqlHandle]=pq.[SqlHandle] union alle 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) som [total_elapsed_timeSec] ,DB_NAME(rs.[database_id]) collate Cyrillic_General_CI_AS as [DBName] ,rs.[is_user_process] ,rs.[login_name] collate Cyrillic_General_name_CI_AS.Crillic_General_CI_AS. [host_name] collate Cyrillic_General_CI_AS ,sq.[TSQL] collate Cyrillic_General_CI_AS--,(vælg top(1) tekst fra sys.dm_exec_sql_text([sql_handle])) som [TSQL] ,pq.[handle]QueryPlan.,[plan rs.[bruger_id] ,rs.[forbindelse_id] ,rs.[database_id] ,rs.[sql_handle] ,rs.[statement_start_offset]--Antallet af tegn i den aktuelt eksekverende pakke eller lagrede procedure, hvori den aktuelle sætning køres . Den kan bruges sammen med de dynamiske administrationsfunktioner, såsom sql_handle, statement_end_offset og sys.dm_exec_sql_text for at få den aktuelt eksekverende sætning for forespørgslen. NULL-værdier er tilladt. ,rs.[statement_end_offset]--Antallet af tegn i den aktuelt eksekverende pakke eller lagrede procedure, hvori den aktuelle sætning blev fuldført. Det kan bruges sammen med dynamiske administrationsfunktioner, såsom sql_handle, statement_end_offset og sys.dm_exec_sql_text for at få den aktuelt eksekverende sætning for forespørgslen. NULL-værdier er tilladt. ,rs.[wait_type] collate Cyrillic_General_CI_AS--waiting type ,rs.[wait_time]--Hvis forespørgslen i øjeblikket er blokeret, indeholder kolonnen den aktuelle ventetid (i ms). NULL-værdier er tilladt. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] collate Cyrillic_General_CI_AS--Hvis forespørgslen blev blokeret tidligere, indeholder kolonnen typen af den seneste ventetid. NULL-værdier er ikke tilladt. ,rs.[wait_resource] collate Cyrillic_General_CI_AS--Hvis forespørgslen i øjeblikket er blokeret, indeholder kolonnen den ressource, for hvilken forespørgslen venter på at blive frigivet. NULL-værdier er ikke tilladt. ,rs.[open_transaction_count]--Antallet af transaktioner, der er tilgængelige for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[open_resultset_count]--Antallet af resulterende sæt tilgængelige for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[transaction_id]--Identifier for transaktionen, hvor forespørgslen udføres. NULL-værdier er ikke tilladt. ,rs.[kontekst_info] ,rs.[percent_completion] ,rs.[estimeret_fuldførelsestid] ,round(cast(rs.[estimeret_færdigelsestid] som decimal(18,3))/1000, 3) som [estimeret_færdiggørelsestidSek.] ,rs. ]--CPU-tid (i ms) brugt på udførelse af forespørgslen. NULL-værdier er ikke tilladt. ,round(cast(rs.[cpu_tid] som decimal(18,3))/1000, 3) som [cpu_timeSec] ,rs.[total_elapsed_time]--samlet tid, der er gået siden anmodningen blev modtaget (i ms). NULL-værdier er ikke tilladt. ,rs.[scheduler_id]--Identifier for skemalæggeren, der planlægger den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[task_address]--Adressen på hukommelsesblokken dedikeret til opgaven relateret til denne forespørgsel. NULL-værdier er tilladt. ,rs.[reads]--Antallet af læsninger udført af den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[skriver]--Antallet af skrivninger udført af den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[logical_reads]--Antallet af logiske læsninger udført af den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[text_size]--Indstilling af parameteren TEXTSIZE for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[language] collate Cyrillic_General_CI_AS--Indstilling af sproget for den givne forespørgsel. NULL-værdier er tilladt. ,rs.[date_format] collate Cyrillic_General_CI_AS--Indstilling af DATEFORMAT-parameteren for den givne forespørgsel. NULL-værdier er tilladt. ,rs.[date_first]--Indstilling af DATEFIRST-parameteren for den givne forespørgsel. NULL-værdier er ikke tilladt. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_advarsler] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs_ull. .[transaction_isolation_level]--Isolationsniveau, som blev oprettet sammen med transaktionen for den givne forespørgsel. NULL-værdier er ikke tilladt (0 er ikke angivet, 1 - 5 værdier er sat stigende på transaktionsisolationsniveauet). ,rs.[lock_timeout]--Lås timeout for den givne forespørgsel (i ms). NULL-værdier er ikke tilladt. ,round(cast(rs.[lock_timeout] som decimal(18,3))/1000, 3) som [lock_timeoutSec] ,rs.[deadlock_priority]--Værdi af DEADLOCK_PRIORITY parameteren for den givne forespørgsel. NULL-værdien er ikke tilladt. ,rs.[row_count]--Antal rækker returneret til klienten for den givne forespørgsel. NULL-værdien er ikke tilladt. ,rs.[prev_error]--Der opstod en tidligere fejl under udførelse af forespørgslen. NULL-værdier er ikke tilladt. ,rs.[nest_level]--Det aktuelle kode-nesting-niveau, der udføres for den givne forespørgsel. NULL-værdien er ikke tilladt. ,rs.[granted_query_memory]--Antallet af sider, der skal udføres forespørgslen. NULL-værdien er ikke tilladt. ,rs.[executing_managed_code]--angiver, om den givne forespørgsel i øjeblikket udfører CLR-objektkoden (f.eks. procedure, type eller trigger). Denne skifte er indstillet i det tidsrum, hvor CLR-objektet er i stakken, selv når Transact-SQL-koden kaldes fra miljøet. NULL-værdier er ikke tilladt. ,rs.[group_id]--ID for arbejdsbelastningsgruppen, som denne forespørgsel tilhører. NULL-værdier er ikke tilladt. ,rs.[query_hash]--Binær hash-værdi beregnes for forespørgslen og bruges til at identificere forespørgsler med lignende logik. Det er muligt at bruge forespørgselshash til at bestemme brugen af ​​statistiske ressourcer for forespørgsler, der kun adskiller sig i deres bogstavelige værdier. ,rs.[query_plan_hash]--Binær hash-værdi beregnes for forespørgselsudførelsesplanen og bruges til at identificere lignende eksekveringsplaner. Det er muligt at bruge plan-hash til at finde de samlede forespørgselsomkostninger med lignende udførelsesplaner. ,rs.[sidste_anmodning_starttidspunkt] ,rs.[sidste_anmodning_sluttid] ,rs.[samlet_planlagt_tid] ,rs.[hukommelsesbrug] ,rs.[nt_brugernavn] collate Cyrillic_General_CI_AS ,rs._i.[nt_curlate ,rs._se._c. 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._port[local]_tcrs,_CIrs. .[client_tcp_port] ,rs.[client_net_address] collate Cyrillic_General_CI_AS ,rs.[EndRegUTCDate] FRA [srv].[RequestStatisticsArchive] som rs med(readuncommitted) indre join [srv].[Plan_onQurery].[Plan_onQurery pq.[PlanHandle] og rs.[sql_handle]=pq.[SqlHandle] indre join [srv].[SQLQuery] som sq på sq.[SqlHandle]=pq.[SqlHandle]GO

    [/udvid]

  6. Se efter udvalget af aktuelle aktive anmodninger:
    [expand title=”Kode”]

    BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE view [inf].[vRequestDetail] som/*aktiv, klar til at blive eksekveret og afventende forespørgsler, samt dem, der eksplicit blokerer andre sessioner */med tbl0 som ( vælg ES .[session_id] ,ER.[blocking_session_id] ,ER.[request_id] ,ER.[starttid] ,ER.[status] ,ER.[kommando] ,ER.[percent_complete] ,DB_Name(coalesce(ER.[database_id]) , ES.[database_id])) som [DBName] ,(vælg top(1) tekst fra sys.dm_exec_sql_text(ER.[sql_handle])) som [TSQL] ,(vælg top(1) [query_plan] fra sys.dm_exec_query_plan (ER.[plan_handle])) som [QueryPlan] ,ER.[wait_type] ,ES.[login_time] ,ES.[host_name] ,ES.[program_name] ,ER.[wait_time] ,ER.[last_wait_type] ,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.[opgaveadresse] ,ER.[læser] ,ER.[skriver] ,ER.[logical_reads] ,ER.[text_size] ,ER.[sprog] ,ER.[dato_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. .[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_y] ,ERmor. 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_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.[domain] ,ES. r ,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] .[database_id] , ES.[database_id]) som [database_id] ,ER.[user_id] ,ER.[connection_id] fra 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] ,[sidste_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimeret_afslutningstid] ,[cpu_tal_time]_e,[cpu_tal _time] _du [opgave_adresse] ,[læser] ,[skriver] ,[logisk_læser] ,[tekst_størrelse] ,[sprog] ,[datoformat] ,[dato_først] ,[citeret_id] ,[arithabort] ,[ansi_null_dflt_ on] ,[ansi_defaults] ,[ansi_advarsler] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null],[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[forhånds_tæller,_morgen] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protokol_type] ,[protokolversion] ,[endpoint_id] ,[me,]_option,[ node_affinity] ,[antal_reads] ,[antal_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] [local_tcp_port] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] , [nt_user_name], [hukommelse_usage], [total_scheduled_time], [last_request_start_time], [last_request_end_time], [is_user_process], [original_security_id], [original_login_name sql_handle],[statement_start_offset],[statement_end_offset],[plan_handle] ,[database_id],[user_id] ,[connection_id] fra tbl0 hvor [status] i ('suspenderet', 'running', 'runnable')), tbl_group as ( vælg [blocking_session_id] fra tbl, hvor [blocking_session_id]<>0 grupperer efter [blocking_session_id]) vælg [session_id],[blocking_session_id],[request_id],[starttid] ,[status],[kommando] ,[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] ,[læser] ,[logiske_tekster,] ,[sprog] ,[dato_format] ,[dato_først] ,[citeret_identifikator] ,[arithabort] ,[ansi_null_dflt_on],[ansi_defaults] ,[ansi_advarsler] ,[ansi_padding] ,[ansi_nulls_n_nulls_n,_nulls_n,_nulls_n,_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] , [forespørgsel_plan_hash] _cent_session-id] _[net_sessions-id], [net_tilslutnings-id] ,[protokoltype] ,[protokolversion] ,[slutpunkts-id] ,[krypteringsmulighed] ,[godkendelsesskema] ,[node_affinity] ,[antal_reads] ,[antal_writes] ,[last_read] ,[sidste_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[reference_port]_tc]s host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[sidste_anmodning] _sidste_anmodning] _sidste_anmodning,_indgangstidspunkt] ,[original_login_name] ,[sidste_successful_logon] ,[sidste_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle],[statement_start_offset] ,[statement_end_plan_offset_connect] ,_tion allselect tbl0.[session_id] ,tbl0.[blocking_session_id] ,tbl0.[request_id] ,tbl0.[ start_tid] ,tbl0.[status] ,tbl0.[kommando] ,tbl0.[percent_complete] ,tbl0.[DBName] ,tbl0.[TSQL] ,tbl0.[QueryPlan] ,tbl0.[wait_type] ,tbl0.[login_tid] ,tbl0.[værtsnavn] ,tbl0.[programnavn] ,tbl0.[ventetid] ,tbl0.[sidste_vente_type] ,tbl0.[wait_ressource] ,tbl0.[åben_transaktionstælling] ,tbl0.[åben_resultatsæt] ,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="Kode"]

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

[/udvid]

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="Kode"]

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] 

[/udvid]

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).

Oversigt

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. Tilslutning af IRI-software til Oracle

  2. Find indeks over sidste forekomst af en understreng ved hjælp af T-SQL

  3. Hvad hedder rør?

  4. Oracle - Klon tabel - Struktur, data begrænsninger og det hele