sql >> Databáze >  >> RDS >> Sqlserver

Implementace společného indikátoru výkonu MS SQL Server

Úvod

Často je potřeba vytvořit ukazatel výkonu, který by ukazoval aktivitu databáze související s předchozím obdobím nebo konkrétním dnem. V článku nazvaném „Implementace indikátoru výkonu SQL Server pro dotazy, uložené procedury a spouštěče“ jsme uvedli příklad implementace tohoto indikátoru.

V tomto článku popíšeme další jednoduchý způsob, jak sledovat, jak a jak dlouho trvá provádění dotazu, a také jak získat plány provádění pro každý časový bod.

Tato metoda je užitečná zejména v případech, kdy potřebujete generovat denní reporty, takže metodu můžete nejen automatizovat, ale také přidat do reportu s minimem technických detailů.

V tomto článku prozkoumáme příklad implementace tohoto běžného ukazatele výkonu, kde bude jako metrika sloužit celkový uplynulý čas.

Řešení

Nejprve poskytneme obecný algoritmus:

1) Pořiďte snímek aktivních dotazů
2) Uložte výsledek
3) Proveďte obecnou analýzu a výsledek uložte do tabulky na konci dne
4) Proveďte srovnávací analýzu přijatých dat

Nyní vám poskytneme některé podrobnosti.

Chcete-li pořídit snímek aktivních dotazů, vytvořte následující tabulky:

  1. Tabulka plánů dotazů
    POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[PlanQuery]( [PlanHandle] [varbinary](64) NOT NULL, [SQLHandle] [varbinary](64) NULL, [QueryPlan] [xml] NULL, [InsertUTCDate] [datetime] NENÍ NULL, OMEZENÍ [PK_PlanQuery] PRIMÁRNÍ KLÍČ SE SLUSTROVANÝ ( [SQLHandle] ASC, [PlanHandle] ASC)WITH (PAD_INDEX =VYPNUTO, STATISTICTE_OFFKEY =OFF_COMISTICTEDORE_N , ALLOW_ROW_LOCKS =ZAPNUTO, ALLOW_PAGE_LOCKS =ZAPNUTO) ZAPNUTO [PRIMÁRNÍ]) NA [PRIMÁRNÍ] TEXTIMAGE_NA [PRIMARY]BRANKÁŘSKÉ TABULKY [srv].[PlanQuery] PŘIDAT OMEZENÍ [DF_PlanQuery_InsertUTCDate)CDate] DEFAULT] DEFAULT> 
  2. Tabulka dotazů
    POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[SQLQuery]( [SQLHandle] [varbinary](64) NOT NULL, [TSQL] [nvarchar](max) NULL [InsertUTCDate] [datetime] NENÍ NULL, OMEZENÍ [PK_SQLQuery] PRIMÁRNÍ KLÍČ SE SLUSTROVANÝM ([SQLHandle] ASC)WITH (PAD_INDEX =VYPNUTO, STATISTICS_NORECOMPUTE =VYPNUTO, IGNORE_DUP_KEY =VYPNUTO, ALLOW_ROW_ROW_KEY ZAPNUTO =ALLOW_ROW_PAGE ONRY) ZAPNUTO =VYPNUTO] [PRIMARY] TEXTIMAGE_ON [PRIMARY]TABULKA BRANKA [srv].[SQLQuery] PŘIDAT OMEZENÍ [DF_SQLQuery_InsertUTCDate] VÝCHOZÍ (getutcdate()) PRO [InsertUTCDate]PŘEJÍT
  3. Tabulka se snímky aktivních dotazů:
    [expand title=”Code”]

    POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[RequestStatistics]( [session_id] [smallint] NOT NULL, [request_id] [int] NULL, [start_time] [datetime] NULL 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, [id_databáze] [smallint] NULL, [id_uživatele] [int] NULL, [id_připojení] [jednoznačný identifikátor] NULL, [id_blokování] [smallint] NULL, [typ_čekání] [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] [skutečné] NULL, [estimated_completion_time] [bigint] NULL, [cpu_time] [int] NULL, [total_elapsed_time] [int] NULL, [id_plánovače int] NULL, [adresa_úlohy] [varbinární](8) NULL, [čtení] [bigint] NULL, [zápis] [bigint] NULL, [logické_čtení] [bigint] NULL, [velikost_textu] [int] NULL, [language] [nvarchar](128) NULL, [formát_data] [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, [úroveň_izolace_transakce] [smallint] NULL, [lock_timeout] [int] NULL, [deadlock_priority] NULL, [počet_řádků] [bigint] NULL, [předchozí_chyba] [int] NULL, [úroveň_vnoření] [int] NULL, [granted_query_memory] [int] NULL, [executing_managed_code] [bit] NULL, [id_skupiny] [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, [poslední_čtení] [čas data] 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_port ] [int] NULL, [id_parent_connection_id] [uniqueidentifier] NULL, [most_recent_sql_handle] [varbinary](64) NULL, [login_time] [datetime] NULL, [host_name] [nvarchar](128) NULL, [program_name] [nvar (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] [date_request_start_time] [čas_ukončení_poslední_žádosti] [datum a čas] NULL, [je_uživatelský_proces] [bit] NULL, [original_sec urity_id] [varbinary](85) NULL, [original_login_name] [nvarchar](128) NULL, [last_successful_logon] [datetime] NULL, [last_unsuccessful_logon] [datetime] NULL, [unsuccessful_logons] [unsuccessful_logons] [biggint_logons] [biggint_logons] ] NULL, [InsertUTCDate] [datetime] NOT NULL, [EndRegUTCDate] [datetime] NULL) NA [PRIMÁRNÍ]TABULCE BRANKŮ [srv].[RequestStatistics] PŘIDAT OMEZENÍ [DF_RequestStatistics_InsertUTCDate] DEFAULT (getutsitc_date)GOertANSICD_date 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 =VYPNUTO, STATISTICS_NORECOMPUTE =VYPNUTO, SORT_IN_TEMPDB =VYPNUTO, DROP_EXISTING =VYPNUTO, ONLINE =VYPNUTO, ALLOW_ROW_SETALS [GOW_SETALP ZAPNUTO =,] ONLOCK_SETALP ONRY =,] ONLOCK_LOWRI =VYPNUTO ANSI_PADDING ONGOCREATE NONCLUSTERED INDEX [indPlanQuery] ON [srv].[RequestStatistics]( [plan_handle ] ASC, [sql_handle] ASC)WHERE ([sql_handle] NENÍ NULL A [plan_handle] NENÍ NULL)WITH (PAD_INDEX =VYPNUTO, STATISTICS_NORECOMPUTE =VYPNUTO, SORT_IN_TEMPDB =VYPNUTO, DROP_EXISTING =VYPNUTO, ONROLINE_EXISTING =VYPNUTO, ONLINE_EXISTING =VYPNUTO ALLOW_PAGE_LOCKS =ZAPNUTO) NA [PRIMARY]PŘEJÍT

    [/expand]

    Podobným způsobem vytvoříme tabulku pro archiv [srv].[RequestStatisticsArchive].

  4. Tabulka s celkovými denními statistikami
    POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[TSQL_DAY_Statistics]( [příkaz] [nvarchar](32) NOT NULL, [DBName] [nvar)char] 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] [desítkové](23, 8) NOT NULL, [min_cpu_timeSec] [desítkové](23, 8) NOT NULL, [min_total_elapsed_timeSec] [decimal](23, 8) NOT NULL, [min_2decimal_timeout , 8) NOT NULL, [max_wait_timeSec] [desetinné](23, 8) NOT NULL, [max_estimated_completion_timeSec] [desítkové](23, 8) NOT NULL, [max_cpu_timeSec] [desetinné](23, 8) NOT_sedtotal_time [ecmax. ] [desítkové](23, 8) NENÍ NULL, [max_lock_timeoutSec] [desítkové](23, 8) NENÍ NULL, [DATUM] [datum] NENÍ NULL) V [PRIMÁRNÍ]TABULCE BRANKA [srv].[TSQL_DAY_Statistics] PŘIDAT OMEZENÍ [DF_TSQL_DAY_Statistics_DATE] VÝCHOZÍ (getutcdate()) PRO [DATE]GOCREATE NENCLUSTERED INDEX [indDATE] ON [srv].[TSQL_DAY_Statistics]( [DATE] ASC)WITH (PAD_INDEX =VYP, STATISTICS_NORECOMPUTE =VYP, SORT_IN_TEMPDB =VYP, DROP_EXISTING =VYP,_AGEWALLINE =VYP, ONLINEWALLINE =VYP. =ON) ON [PRIMARY]PŘEJÍT
  5. Zobrazit podle zaznamenaných snímků aktivních dotazů
    [expand title=”Code”]

    POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE zobrazení [srv].[vRequestStatistics] jako/*statistika dotazu*/SELECT rs.[status] collate Cyrillic_General_CI_AS jako [stav] ,rs.[Vložte.[UTCDate] ] ,rs.[command] porovnat Cyrillic_General_CI_AS jako [command] ,rs.[session_id] ,rs.[blocking_session_id] ,round(cast(rs.[total_elapsed_time] as decimal(18,3))/1000, 3) jako [ total_elapsed_timeSec] ,DB_NAME(rs.[database_id]) porovnat Cyrillic_General_CI_AS jako [DBName] ,rs.[is_user_process] ,rs.[login_name] porovnat Cyrillic_General_CI_AS jako [login_name] ,rs.[jméno_programu] porovnat program Cyrillic_General_CIrs_AS. [host_name] porovnat Cyrillic_General_CI_AS jako [host_name] ,sq.[TSQL] porovnat Cyrillic_General_CI_AS jako [TSQL]--,(vyberte top(1) text ze sys.dm_exec_sql_text([sql_handle])) jako [TSQL] ,pq.[QueryPlan] ] ,rs.[plan_handle] ,rs.[user_id] ,rs.[connection_id] ,rs.[database_id] ,rs.[sql_handle] ,rs.[ statement_start_offset] -- Počet znaků v aktuálně prováděném balíčku nebo uložené proceduře, ve které je spuštěn aktuální příkaz. Lze jej použít společně s funkcemi dynamické správy, jako je sql_handle, statement_end_offset a sys.dm_exec_sql_text, k získání aktuálně prováděného příkazu pro dotaz. Hodnoty NULL jsou povoleny. ,rs.[statement_end_offset] -- Počet znaků v aktuálně prováděném balíčku nebo uložené proceduře, ve které byl dokončen aktuální příkaz. Lze jej použít společně s funkcemi dynamické správy, jako je sql_handle, statement_end_offset a sys.dm_exec_sql_text, k získání aktuálně prováděného příkazu pro dotaz. Hodnoty NULL jsou povoleny. ,rs.[wait_type] porovná Cyrillic_General_CI_AS jako [wait_type]--typ čekání ,rs.[wait_time]--Pokud je dotaz aktuálně blokován, sloupec obsahuje čekací dobu (v ms). Hodnoty NULL nejsou povoleny. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) jako [wait_timeSec] ,rs.[last_wait_type] collate Cyrillic_General_CI_AS as [last_wait_type] -- Pokud byl dotaz zablokován dříve, sloupec obsahuje typ poslední čekací doby. Hodnoty NULL nejsou povoleny. ,rs.[wait_resource] collate Cyrillic_General_CI_AS jako [wait_resource] -- Pokud je dotaz aktuálně blokován, sloupec označuje zdroj, pro který dotaz čeká na uvolnění. Hodnoty NULL nejsou povoleny. ,rs.[open_transaction_count] -- Počet transakcí dostupných pro tento dotaz. Hodnoty NULL nejsou povoleny. ,rs.[open_resultset_count] -- Počet výsledných sad dostupných pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[id_transakce] -- Identifikátor transakce aktuálně prováděného dotazu. Hodnoty NULL nejsou povoleny. ,rs.[context_info] ,rs.[percent_complete] ,rs.[estimated_completion_time] ,round(cast(rs.[odhadovaný_čas_dokončení] jako decimal(18,3))/1000, 3) jako [odhadovaný_čas_dokončeníSec] ,rs.[doba_dokončení] ]--Čas CPU (v ms) strávený provedením dotazu. Hodnoty NULL nejsou povoleny. ,round(cast(rs.[cpu_time] jako decimal(18,3))/1000, 3) jako [cpu_timeSec] ,rs.[total_elapsed_time] -- Celkový čas, který uplynul od přijetí požadavku (v ms). Hodnoty NULL nejsou povoleny. ,rs.[id_plánovače] -- Identifikátor plánovače, který plánuje daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[adresa_úlohy] -- Adresa paměťového bloku vyhrazeného pro úlohu relevantní pro tento požadavek. Hodnoty NULL jsou povoleny. ,rs.[čtení] -- Počet čtení provedených daným dotazem. Hodnoty NULL jsou povoleny. ,rs.[writes] -- Počet zápisů provedených daným dotazem. Hodnoty NULL nejsou povoleny. ,rs.[logické_čtení] -- Počet logických čtení provedených daným dotazem. Hodnoty NULL nejsou povoleny. ,rs.[text_size] -- Nastavení parametru TEXTSIZE pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[jazyk] collate Cyrillic_General_CI_AS jako [jazyk] -- Nastavení jazyka pro daný dotaz. Hodnoty NULL jsou povoleny. ,rs.[date_format] collate Cyrillic_General_CI_AS jako [date_format] -- Nastavení parametru DATEFORMAT pro daný dotaz. Hodnoty NULL jsou povoleny. ,rs.[date_first] -- Nastavení parametru DATEFIRST pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs.[concat_null_yieldrs_null] .[transaction_isolation_level] -- úroveň izolace transakce pro daný dotaz. Hodnoty NULL nejsou povoleny (0 není specifikováno, 1 – 5 hodnot je nastaveno vzestupně podle úrovně izolace transakcí). ,rs.[lock_timeout] -- Časový limit zámku pro daný dotaz (v ms). Hodnoty NULL nejsou povoleny. ,round(cast(rs.[lock_timeout] jako decimal(18,3))/1000, 3) jako [lock_timeoutSec] ,rs.[deadlock_priority] -- Hodnota parametru DEADLOCK_PRIORITY pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[row_count] -- Počet řádků vrácených klientovi pro tento dotaz. Hodnoty NULL nejsou povoleny. ,rs.[prev_error] -- Při provádění dotazu došlo k předchozí chybě. Hodnoty NULL nejsou povoleny. ,rs.[úroveň_vnoření] -- Aktuální úroveň úrovně vnoření kódu provedené pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[granted_query_memory] -- Počet stránek pro provedení dotazu. Hodnoty NULL nejsou povoleny. ,rs.[executing_managed_code] -- Označuje, zda daný dotaz aktuálně provádí kód objektu CLR (například proceduru, typ nebo spouštěč). Tento přepínač je nastaven, když je objekt CLR v zásobníku, i když je kód Transact-SQL volán z prostředí. Hodnoty NULL nejsou povoleny. ,rs.[id_skupiny] -- ID skupiny zátěže, do které tento dotaz patří. Hodnoty NULL nejsou povoleny. ,rs.[query_hash] --Binární hash-hodnota se vypočítá pro dotaz a použije se k identifikaci dotazů s podobnou logikou. Je možné použít hash dotazu k určení využití statistických zdrojů pro dotazy, které se liší pouze svými doslovnými hodnotami. ,rs.[query_plan_hash] --Binární hodnota hash se vypočítá pro plán provádění dotazu a použije se k identifikaci podobných plánů provádění. Je možné použít hash plánu k nalezení celkových nákladů na dotaz s podobnými plány provádění. ,rs.[last_request_start_time] ,rs.[last_request_end_time] ,rs.[total_scheduled_time] ,rs.[memory_usage] ,rs.[nt_user_name] porovnejte Cyrillic_General_CI_AS jako [nt_user_name] ,rs.[nt_domain] CIAS collate_domain] nt_domain collate_domain. .[security_id] ,rs.[client_interface_name] porovnat Cyrillic_General_CI_AS jako [client_interface_name] ,rs.[client_version] ,rs.[host_process_id] ,rs.[login_time] ,rs.[most_recent_sql_handle] ,rs.[id] ,connection_. local_tcp_port] ,rs.[local_net_address] porovnat Cyrillic_General_CI_AS jako [local_net_address] ,rs.[client_tcp_port] ,rs.[client_net_address] porovnat Cyrillic_General_CI_AS jako [client_net_address] ,rs.[EndRegUTsrvCD s [EndRegUTsrvCD] readuncommitted) vnitřní spojení [srv].[PlanQuery] jako pq na rs.[plan_handle]=pq.[PlanHandle] a rs.[sql_handle]=pq.[SqlHandle] vnitřní spojení [srv].[SQLQuery] jako sq na sq .[SqlHandle]=pq.[SqlHandle] sjednocení všech SELECT rs.[stav] collate Cyrillic_General_ CI_AS ,rs.[InsertUTCDate] ,rs.[start_time] ,rs.[příkaz] porovnat Cyrillic_General_CI_AS ,rs.[id_relace] ,rs.[blocking_session_id] ,round(cast(rs.[total_elapsed_time] as decimal(18,3)) )/1000, 3) jako [total_elapsed_timeSec] ,DB_NAME(rs.[database_id]) shromáždí Cyrillic_General_CI_AS jako [DBName] ,rs.[is_user_process] ,rs.[login_name] collate Cyrillic_General_CI_AS ,rs.Cyril_CI_AS ,rs.[název_programu] collate_Cyrillic_General_CI_AS ,rs. [host_name] collate Cyrillic_General_CI_AS ,sq.[TSQL] collate Cyrillic_General_CI_AS--,(vyberte top(1) text ze sys.dm_exec_sql_text([sql_handle])) jako [TSQL] ,pq.[QueryPlan] ,rs,[plan_handle] ] ,rs.[plan_handle] rs.[id_uživatele] ,rs.[id_připojení] ,rs.[id_databáze] ,rs.[sql_handle] ,rs.[statement_start_offset]--Počet znaků v aktuálně prováděném balíčku nebo uložené proceduře, ve které je aktuální příkaz spuštěn . Lze jej použít společně s funkcemi dynamické správy, jako je sql_handle, statement_end_offset a sys.dm_exec_sql_text k získání aktuálně prováděného příkazu pro dotaz. Hodnoty NULL jsou povoleny. ,rs.[statement_end_offset] -- Počet znaků v aktuálně prováděném balíčku nebo uložené proceduře, ve které byl dokončen aktuální příkaz. Lze jej použít společně s funkcemi dynamické správy, jako je například sql_handle, statement_end_offset a sys.dm_exec_sql_text k získání aktuálně prováděného příkazu pro dotaz. Hodnoty NULL jsou povoleny. ,rs.[wait_type] collate Cyrillic_General_CI_AS--typ čekání ,rs.[wait_time]--Pokud je dotaz aktuálně blokován, sloupec obsahuje aktuální dobu čekání (v ms). Hodnoty NULL jsou povoleny. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] collate Cyrillic_General_CI_AS--Pokud byl dotaz zablokován dříve, sloupec obsahuje typ nejnovější čekání. Hodnoty NULL nejsou povoleny. ,rs.[wait_resource] collate Cyrillic_General_CI_AS -- Pokud je dotaz aktuálně blokován, sloupec obsahuje zdroj, pro který dotaz čeká na uvolnění. Hodnoty NULL nejsou povoleny. ,rs.[open_transaction_count] -- Počet transakcí dostupných pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[open_resultset_count] -- Počet výsledných sad dostupných pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[id_transakce] -- Identifikátor transakce, ve které je dotaz prováděn. Hodnoty NULL nejsou povoleny. ,rs.[context_info] ,rs.[percent_complete] ,rs.[estimated_completion_time] ,round(cast(rs.[odhadovaný_čas_dokončení] jako decimal(18,3))/1000, 3) jako [odhadovaný_čas_dokončeníSec] ,rs.[doba_dokončení] ]--Čas CPU (v ms) strávený prováděním dotazu. Hodnoty NULL nejsou povoleny. ,round(cast(rs.[cpu_time] jako decimal(18,3))/1000, 3) jako [cpu_timeSec] ,rs.[total_elapsed_time] -- Celkový čas, který uplynul od přijetí požadavku (v ms). Hodnoty NULL nejsou povoleny. ,rs.[id_plánovače] -- Identifikátor plánovače, který plánuje daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[adresa_úlohy] -- Adresa paměťového bloku vyhrazeného pro úlohu související s tímto dotazem. Hodnoty NULL jsou povoleny. ,rs.[čtení] -- Počet čtení provedených daným dotazem. Hodnoty NULL nejsou povoleny. ,rs.[writes] -- Počet zápisů provedených daným dotazem. Hodnoty NULL nejsou povoleny. ,rs.[logické_čtení] -- Počet logických čtení provedených daným dotazem. Hodnoty NULL nejsou povoleny. ,rs.[text_size] -- Nastavení parametru TEXTSIZE pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[language] collate Cyrillic_General_CI_AS -- Nastavení jazyka pro daný dotaz. Hodnoty NULL jsou povoleny. ,rs.[date_format] collate Cyrillic_General_CI_AS -- Nastavení parametru DATEFORMAT pro daný dotaz. Hodnoty NULL jsou povoleny. ,rs.[date_first] -- Nastavení parametru DATEFIRST pro daný dotaz. Hodnoty NULL nejsou povoleny. ,rs.[quoted_identifier] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs.[concat_null_yieldrs_null] .[transaction_isolation_level] -- Úroveň izolace, která byla vytvořena spolu s transakcí pro daný dotaz. Hodnoty NULL nejsou povoleny (0 není specifikováno, 1 - 5 hodnot je nastaveno vzestupně po úrovni izolace transakce). ,rs.[lock_timeout] -- Časový limit zámku pro daný dotaz (v ms). Hodnoty NULL nejsou povoleny. ,round(cast(rs.[lock_timeout] jako decimal(18,3))/1000, 3) jako [lock_timeoutSec] ,rs.[deadlock_priority] -- Hodnota parametru DEADLOCK_PRIORITY pro daný dotaz. Hodnota NULL není povolena. ,rs.[row_count] -- Počet řádků vrácených klientovi pro daný dotaz. Hodnota NULL není povolena. ,rs.[prev_error] -- Při provádění dotazu došlo k předchozí chybě. Hodnoty NULL nejsou povoleny. ,rs.[úroveň_vnoření] -- Aktuální úroveň vnoření kódu provedená pro daný dotaz. Hodnota NULL není povolena. ,rs.[granted_query_memory] -- Počet stránek pro provedení dotazu. Hodnota NULL není povolena. ,rs.[executing_managed_code] --udává, zda daný dotaz aktuálně spouští objektový kód CLR (například proceduru, typ nebo spouštěč). Tento přepínač je nastaven během doby, kdy je objekt CLR v zásobníku, i když je kód Transact-SQL volán z prostředí. Hodnoty NULL nejsou povoleny. ,rs.[id_skupiny] -- ID skupiny zátěže, do které tento dotaz patří. Hodnoty NULL nejsou povoleny. ,rs.[query_hash] --Binární hash-hodnota se vypočítá pro dotaz a použije se k identifikaci dotazů s podobnou logikou. Je možné použít hash dotazu k určení použití statistických zdrojů pro dotazy, které se liší pouze svými doslovnými hodnotami. ,rs.[query_plan_hash] --Binární hodnota hash se vypočítá pro plán provádění dotazu a použije se k identifikaci podobných plánů provádění. Je možné použít hash plánu k nalezení celkových nákladů na dotaz s podobnými plány provádění. ,rs.[last_request_start_time] ,rs.[last_request_end_time] ,rs.[total_scheduled_time] ,rs.[memory_usage] ,rs.[nt_user_name] collate Cyrillic_General_CI_AS ,rs.[nt_domain] collate Cyrillic_General[security_IDrs].[ client_interface_name] collate Cyrillic_General_CI_AS ,rs.[client_version] ,rs.[host_process_id] ,rs.[login_time] ,rs.[most_recent_sql_handle] ,rs.[parent_connection_id] ,rs.[local_tcp_port] ,rs[local_tcp_Port] ,rs[local_col_net_General_CIaddress]localrs col_net_General_CIad. .[client_tcp_port] ,rs.[client_net_address] porovnejte Cyrillic_General_CI_AS ,rs.[EndRegUTCDate] OD [srv].[RequestStatisticsArchive] jako rs s (readuncommitted) vnitřním spojením [srv].[PlanQuery] jako pqle]=plan_hand [plan_hand] rs.[ pq.[PlanHandle] a rs.[sql_handle]=pq.[SqlHandle] vnitřní spojení [srv].[SQLQuery] jako sq na sq.[SqlHandle]=pq.[SqlHandle]GO

    [/expand]

  6. Zobrazení podle výběru aktuálních aktivních požadavků:
    [expand title=”Code”]

    POUŽÍVEJTE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE zobrazení [inf].[vRequestDetail] jako/*aktivní, připravené ke spuštění a čekající dotazy, stejně jako ty, které explicitně blokují další relace */s tbl0 as ( vyberte ES [id_relace] ,ER.[id_blokování] ,ER.[id_requestu] ,ER.[čas_zahájení] ,ER.[stav] ,ER.[příkaz] ,ER.[percent_complete] ,DB_Name(coalesce(ER.[database_id]) , ES.[database_id])) jako [DBName] ,(vyberte top(1) text ze sys.dm_exec_sql_text(ER.[sql_handle])) jako [TSQL] ,(vyberte top(1) [query_plan] ze sys.dm_exec_query_plan (ER.[plan_handle])) jako [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.[id_plánovače] ,ER.[adresa_úkolu] ,ER.[čte] ,ER.[zapisuje] ,ER.[logické_čtení] ,ER.[velikost_textu] ,ER.[jazyk] ,ER.[formát_data] ,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_memory] ,ER.[ executing_managed_code] ,ER.[id_skupiny] ,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.[počet_čtení] ,EC.[číslo_zápisu] ,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] ,EC .[parent_connection_id] ,EC.[most_recent_sql_handle] ,ES.[host_process_id] ,ES.[client_version] ,ES.[client_interface_name] ,ES.[security_id] ,ES.[login_name] ,ES.[nt_domain] ,ES.[ nt_user_name] ,ES.[memory_usage] ,ES.[total_scheduled_time] ,ES.[last_request_start_time] ,ES.[last_request_end_time] ,ES.[is_user_process] ,ES.[original_security_id] ,ES.[original_cess_ful]ESuc_cess]last_login] ,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] ,coalesce].[data_id(ER) , ES.[id_databáze]) jako [id_databáze] ,ER.[id_uživatele] ,ER.[id_připojení] ze 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 =ES. [session_id] ,[blocking_session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[percent_complete] ,[DBName] ,[TSQL] ,[QueryPlan] ,[wait_type] ,[login_name] ] ,[program_name] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[,_scheduled_time]_id [adresa_úkolu] ,[čtení] ,[zápisy] ,[logické_čtení] ,[velikost_textu] ,[jazyk] ,[formát_data] ,[první_datum] ,[identifikátor uvozovky] ,[arithabort] ,[ansi_null_dflt_ on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[předchozí_chyba] ,[předchozí_počet,[ne] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[end_crypt_me_op] ,[encrypt_me_op] ,[encrypt_me_op] node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_net_connection] ,[local_host_process],[local_tcp_cent_port],[místní_tcp_cent_port] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[ sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[database_id] ,[user_id] ,[connection_id] z tbl0 kde [stav] v ('suspended', 'runnable', 'runnable_group')), tbl (vyberte [blocking_session_id] z tbl, kde [blocking_session_id]<>0 seskupit podle [blocking_session_id])vyberte [id_relace] ,[id_relace_blokování] ,[id_žádosti] ,[čas_zahájení] ,[stav] ,[příkaz] ,[percent_command 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] ,[odhadovaný_čas_dokončení] ,[cpu_time] ,[celkový_elapsed_time] ,[id_plánovače] ,[adresa_úlohy] ,[čtení] ,[logické_čtení] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_conull_sols] ,[ansi_conull_sols] ,alevel] lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash_time] ,[session_plan_hash_cent] ,[session_net] ,[mostsion ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[poslední_čtení] ,[poslední_zápis] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_net_address] ,[reset_id] [lokální_spojení] ,_id_místního_sítě] [local_tc host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request,[endgin_isst_time]origin ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle] ,[statement_start_offset] ,[us]data]id_plánu] ,[dat],[id_plánu] blueset allselect tbl0.[id_relace] ,tbl0.[id_blokování_relace] ,tbl0.[id_requestu] ,tbl0.[ start_time] ,tbl0.[stav] ,tbl0.[příkaz] ,tbl0.[percent_complete] ,tbl0.[DBName] ,tbl0.[TSQL] ,tbl0.[QueryPlan] ,tbl0.[wait_type] ,tbl0.[login_time] ,tbl0.[název_hostitele] ,tbl0.[název_programu] ,tbl0.[doba čekání] ,tbl0.[typ_posledního_čekání] ,tbl0.[zdroj_čekání] ,tbl0.[počet_otevřených_transakcí] ,tbl0.[počet_otevřených_výsledků] ,tbl0.[,id_transakce]]. .[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; NASTAVIT ÚROVEŇ IZOLACE TRANSAKCE PŘEČTENÁ NEZÁVAZNĚ; 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; NASTAVIT ÚROVEŇ IZOLACE TRANSAKCE PŘEČTENÁ NEZÁVAZNĚ; 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]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).

Shrnutí

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. 5 způsobů aktualizace dat pomocí dílčího dotazu v Oracle SQL

  2. Jak používat SQL kurzory pro speciální účely

  3. SQLException:Řetězec nebo binární data by byla zkrácena

  4. Funkce ACOS() v Oracle