Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Implementacja wspólnego wskaźnika wydajności MS SQL Server

Wprowadzenie

Często zachodzi potrzeba stworzenia wskaźnika wydajności, który pokazywałby aktywność bazy danych związaną z poprzednim okresem lub konkretnym dniem. W artykule zatytułowanym „Implementowanie wskaźnika wydajności serwera SQL dla zapytań, procedur składowanych i wyzwalaczy” podaliśmy przykład implementacji tego wskaźnika.

W tym artykule opiszemy inny prosty sposób śledzenia, jak i jak długo trwa wykonanie zapytania, a także jak pobrać plany wykonania dla każdego punktu czasowego.

Ta metoda jest szczególnie przydatna w przypadkach, gdy musisz generować codzienne raporty, dzięki czemu możesz nie tylko zautomatyzować metodę, ale także dodać ją do raportu przy minimalnych szczegółach technicznych.

W tym artykule przyjrzymy się przykładowi wdrożenia tego wspólnego wskaźnika wydajności, w którym całkowity upływający czas będzie służył jako metryka.

Rozwiązanie

Najpierw podajemy ogólny algorytm:

1) Zrób migawkę aktywnych zapytań
2) Zapisz wynik
3) Wykonaj analizę ogólną i zapisz wynik do tabeli na koniec dnia
4) Wykonaj analizę porównawczą otrzymanych danych

Teraz przedstawimy kilka szczegółów.

Aby zrobić migawkę aktywnych zapytań, utwórz następujące tabele:

  1. Tabela planów zapytań
    USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[PlanQuery]( [PlanHandle] [varbinary](64) NOT NULL, [SQLHandle] [varbinary](64) NOT NULL, [QueryPlan] [xml] NULL, [InsertUTCDate] [data i godzina] NIE NULL, OGRANICZENIE [PK_PlanQuery] KLUCZ PODSTAWOWY CLUSTERED ([SQLHandle] ASC, [PlanHandle] ASC) Z (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF_KEY =OFF_IGNORE , ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] TABELA GOALTERÓW [srv]. [PlanQuery] DODAJ OGRANICZENIE [DF_PlanQuery_InsertUTCDate] DEFAULT (getutcdate())> 
  2. Tabela zapytań
    USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[SQLQuery]( [SQLHandle] [varbinary](64) NOT NULL, [TSQL] [nvarchar](max) NULL, [InsertUTCDate] [data/godzina] NIE NULL, OGRANICZENIE [PK_SQLQuery] KLUCZ PODSTAWOWY CLUSTERED ([SQLHandle] ASC) Z (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE ON)_PRSIM =ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [srv].[SQLQuery] DODAJ OGRANICZENIE [DF_SQLQuery_InsertUTCDate] DOMYŚLNE (getutcdate()) DLA [InsertUTCDate]GO
  3. Tabela z migawkami aktywnych zapytań:
    [expand title=”Kod”]

    USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[RequestStatistics]( [identyfikator_sesji] [smallint] NOT NULL, [identyfikator żądania] [int] NULL, [czas_początku] [data i godzina] NULL, [stan] nvarchar](30) NULL, [polecenie] [nvarchar](32) NULL, [sql_handle] [varbinary](64) NULL, [statement_start_offset] [int] NULL, [statement_end_offset] [int] NULL, [plan_handle] [varbinary ](64) NULL, [identyfikator bazy danych] [smallint] NULL, [identyfikator użytkownika] [int] NULL, [identyfikator_połączenia] [unikalny identyfikator] NULL, [identyfikator_blokowania_sesji] [mały] NULL, [typ_czeku] [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, [procent_complete] [real] NULL, [estimated_completion_time] [bigint] NULL, [cpu_time] [int] NULL, [total_elapsed_time] [int] NULL, [scheduler_id] [ int] NULL, [adres_zadania] [zmienna](8) NULL, [odczyty] [bigint] NULL, [zapisuje] [bigint] NULL, [odczyty_logiczne] [bigint] NULL, [rozmiar_tekstu] [int] NULL, [język] [nvarchar](128) NULL, [format_daty] [nvarchar ](3) NULL, [data_pierwsza] [mała] NULL, [identyfikator_cytowany] [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] [mały] NULL, [lock_timeout] [int] NULL, [deadlock_priority] [int] NULL, [liczba_wierszy] [bigint] NULL, [prev_error] [int] NULL, [poziom_gniazda] [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, [ typ_protokołu] [nvarchar](40) NULL, [wersja_protokołu] [int] NULL, [identyfikator punktu końcowego] [int] NULL, [opcja_szyfrowania] ] [nvarchar](40) NULL, [auth_scheme] [nvarchar](40) NULL, [node_affinity] [smallint] NULL, [liczba_odczytów] [int] NULL, [num_writes] [int] NULL, [ostatnie_odczyt] [datagodzina] NULL, [last_write] [data i godzina] 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, [identyfikator_procesu_hosta] [int] NULL, [wersja_klienta] [int] NULL, [nazwa_interfejsu_klienta] [nvarchar](32) NULL, [identyfikator_zabezpieczeń] [zmienna](85) NULL, [nazwa_logowania] [nvarchar]( 128) NULL, [nt_domain] [nvarchar](128) NULL, [nt_user_name] [nvarchar](128) NULL, [memory_usage] [int] NULL, [całkowity_zaplanowany_czas] [int] NULL, [last_request_start_time] [datetime] NULL, [last_request_end_time] [datetime] NULL, [is_user_process] [bit] NULL, [original_sec urity_id] [varbinary](85) NULL, [original_login_name] [nvarchar](128) NULL, [last_successful_logon] [datetime] NULL, [last_unsuccessful_logon] [datetime] NULL, [unsuccessful_successful_logon] [biznesowe_dane] ] NULL, [InsertUTCDate] [datetime] NIE NULL, [EndRegUTCDate] [datetime] NULL) W [PRIMARY]TABELI GOALTERÓW [srv].[RequestStatistics] DODAJ OGRANICZENIE [DF_RequestStatistics_InsertUTCDate] DEFAULT (getutcdate()SICDADPADDING) ONGOCREATE CLUSTERED INDEX [indRequest] ON [srv].[RequestStatistics]( [id_sesji] ASC, [id_request] ASC, [data_id] ASC, [user_id] ASC, [start_time] ASC, [command] ASC, [sql_handle] ASC, [obsługa_planu] ASC, [identyfikator_transakcji] ASC, [id_połączenia] ASC) Z (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, ONLINE =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKPRIM =ON) ANSI_PADDING ONGOCREATE NIEZAKLOSTEROWANY INDEKS [indPlanQuery] ON [srv].[RequestStatistics]( [plan_handle ] ASC, [sql_handle] ASC) WHERE ([sql_handle] NIE JEST NULL I [plan_handle] NIE JEST NULL) Z (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, ONLINE =OFF, ALLOW_ROW ALLOW_PAGE_LOCKS =ON) W [PRIMARY]GO

    [/rozwiń]

    W podobny sposób tworzymy tabelę dla archiwum [srv].[RequestStatisticsArchive].

  4. Tabela z całkowitymi statystykami dziennymi
    USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[TSQL_DAY_Statistics]( [polecenie] [nvarchar](32) NOT NULL, [DBName] [nvarchar](128) NOT NULL, [PlanHandle] [varbinary](64) NOT NULL, [SqlHandle] [varbinary](64) NOT NULL, [execution_count] [bigint] NOT NULL, [min_wait_timeSec] [dziesiętny](23, 8) NOT NULL, [min_estimated_completion_timeSec] [dziesiętne](23, 8) NOT NULL, [min_cpu_timeSec] [decimal](23, 8) NOT NULL, [min_total_elapsed_timeSec] [dziesiętne](23, 8) NOT NULL, [min_lock_timeoutSec] [dziesiętne](23) , 8) NOT NULL, [max_wait_timeSec] [dziesiętny](23, 8) NOT NULL, [max_estimated_completion_timeSec] [dziesiętny](23, 8) NOT NULL, [max_cpu_timeSec] [dziesiętny](23, 8) NOT NULL, [max_total_elapsed_timeSec ] [dziesiętny](23, 8) NOT NULL, [max_lock_timeoutSec] [dziesiętny](23, 8) NOT NULL, [DATA] [data] NOT NULL) W [PRIMARY]TABELI BRAMKARÓW [srv].[TSQL_DAY_Statistics] DODAJ OGRANICZENIE [DF_TSQL_DAY_Statistics_DATE] DOMYŚLNE (getutcdate()) FOR [DATA]GOCREATE INDEKS NIEKLASTROWANY [indDATE] ON [srv].[TSQL_DAY_Statistics]( [DATE] ASC)Z (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, ONLINE =OFF_S =ALLOW_ROW_ =ON) ON [PRIMARY] START
  5. Wyświetl nagrane migawki aktywnych zapytań
    [expand title=”Kod”]

    UŻYJ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE widok [srv].[vRequestStatistics] jako/*statystyka zapytań*/SELECT rs.[stan] zestawiaj Cyrillic_General_CI_AS jako [stan] ,rs.[Insert,rs.[start_start] ] ,rs.[polecenie] zestawiaj Cyrillic_General_CI_AS jako [polecenie] ,rs.[identyfikator_sesji] ,rs.[id_sesji_blokującej] ,round(cast(rs.[całkowity_upływ_czasu]) jako dziesiętny(18,3))/1000, 3) jako [ total_elapsed_timeSec] ,DB_NAME(rs.[database_id]) sortuj Cyrillic_General_CI_AS jako [DBName] ,rs.[is_user_process] ,rs.[login_name] sortuj Cyrillic_General_CI_AS jako [login_name] ,rs.[nazwa_programu]_.rsCI_collate CyrillAS [nazwa_hosta] zestawiaj Cyrillic_General_CI_AS jako [nazwa_hosta] ,sq.[TSQL] zestawiaj Cyrillic_General_CI_AS jako [TSQL]--,(wybierz tekst top(1) z sys.dm_exec_sql_text([sql_handle])) jako [TSQL] ,pq.[QueryPlan ] ,rs.[uchwyt_planu] ,rs.[identyfikator_użytkownika] ,rs.[identyfikator_połączenia] ,rs.[identyfikator_bazy_danych] ,rs.[uchwyt_sql] ,rs.[ statement_start_offset] — liczba znaków w aktualnie wykonywanym pakiecie lub procedurze składowanej, w której uruchomiona jest bieżąca instrukcja. Może być używany razem z funkcjami dynamicznego zarządzania, takimi jak sql_handle, statement_end_offset i sys.dm_exec_sql_text, aby uzyskać aktualnie wykonywaną instrukcję dla zapytania. Dozwolone są wartości NULL. ,rs.[statement_end_offset]--Liczba znaków w aktualnie wykonywanym pakiecie lub procedurze składowanej, w której bieżąca instrukcja została zakończona. Może być używany razem z funkcjami dynamicznego zarządzania, takimi jak sql_handle, statement_end_offset i sys.dm_exec_sql_text, aby uzyskać aktualnie wykonywaną instrukcję dla zapytania. Dozwolone są wartości NULL. ,rs.[wait_type] zestawiaj Cyrillic_General_CI_AS jako [wait_type]--typ oczekiwania ,rs.[wait_time]--Jeśli zapytanie jest aktualnie zablokowane, kolumna zawiera czas oczekiwania (w ms). Wartości NULL są niedozwolone. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] zestawiaj Cyrillic_General_CI_AS jako [last_wait_type]--Jeśli zapytanie zostało wcześniej zablokowane, kolumna zawiera rodzaj ostatniego czasu oczekiwania. Wartości NULL są niedozwolone. ,rs.[wait_resource] zestawiaj Cyrillic_General_CI_AS jako [wait_resource]--Jeśli zapytanie jest aktualnie zablokowane, kolumna wskazuje zasób, dla którego zapytanie oczekuje na zwolnienie. Wartości NULL są niedozwolone. ,rs.[liczba_otwartych_transakcji]--Liczba transakcji dostępnych dla tego zapytania. Wartości NULL są niedozwolone. ,rs.[open_resultset_count] — liczba zestawów wynikowych dostępnych dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[id_transakcji] — identyfikator transakcji aktualnie wykonywanego zapytania. Wartości NULL są niedozwolone. ,rs.[informacje_kontekstowe] ,rs.[procent_ukończenia] ,rs.[szacowany_czas_ukończenia] ,round(cast(rs.[szacowany_czas_ukończenia] jako dziesiętny(18,3))/1000, 3) jako [szacowany_czas_ukończenia] ,rs.[cpu_time] ]--Czas procesora (w ms) poświęcony na wykonanie zapytania. Wartości NULL są niedozwolone. ,round(cast(rs.[cpu_time] as decimal(18,3))/1000, 3) as [cpu_timeSec] ,rs.[total_elapsed_time]--Całkowity czas, który upłynął od otrzymania żądania (w ms). Wartości NULL są niedozwolone. ,rs.[scheduler_id] — identyfikator programu planującego, który planuje dane zapytanie. Wartości NULL są niedozwolone. ,rs.[adres_zadania]--Adres bloku pamięci przeznaczonego dla zadania związanego z tym żądaniem. Dozwolone są wartości NULL. ,rs.[odczyty]--Liczba odczytów wykonanych przez dane zapytanie. Dozwolone są wartości NULL. ,rs.[writes]--Liczba zapisów wykonanych przez dane zapytanie. Wartości NULL są niedozwolone. ,rs.[odczyty_logiczne]--Liczba odczytów logicznych wykonanych przez dane zapytanie. Wartości NULL są niedozwolone. ,rs.[rozmiar_tekstu] — ustawianie parametru TEXTSIZE dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[język] zestawia Cyrillic_General_CI_AS jako [język] — ustawia język dla danego zapytania. Dozwolone są wartości NULL. ,rs.[format_daty] zestawia Cyrillic_General_CI_AS jako [format_daty] — ustawianie parametru DATEFORMAT dla danego zapytania. Dozwolone są wartości NULL. ,rs.[data_pierwsza]--ustawienie parametru DATEFIRST dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[identyfikator_cytatu] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs.[concat_rs_null_y] .[poziom_izolacji_transakcji]--poziom izolacji transakcji dla danego zapytania. Wartości NULL są niedozwolone (0 nie jest określone, 1–5 wartości jest ustawianych w kolejności rosnącej na poziomie izolacji transakcji). ,rs.[lock_timeout]--Limit czasu blokady dla danego zapytania (w ms). Wartości NULL są niedozwolone. ,round(cast(rs.[lock_timeout] as decimal(18,3))/1000, 3) as [lock_timeoutSec] ,rs.[deadlock_priority]--Wartość parametru DEADLOCK_PRIORITY dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[liczba_wierszy]--Liczba wierszy zwróconych klientowi dla tego zapytania. Wartości NULL są niedozwolone. ,rs.[poprzedni_błąd]--Wystąpił poprzedni błąd podczas wykonywania zapytania. Wartości NULL są niedozwolone. ,rs.[poziom_zagnieżdżenia]--bieżący poziom poziomu zagnieżdżenia kodu wykonywany dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[granted_query_memory]--Liczba stron do wykonania zapytania. Wartości NULL są niedozwolone. ,rs.[executing_managed_code] — wskazuje, czy dane zapytanie aktualnie wykonuje kod obiektu CLR (na przykład procedurę, typ lub wyzwalacz). Ten przełącznik jest ustawiany, gdy obiekt CLR znajduje się na stosie, nawet gdy kod Transact-SQL jest wywoływany ze środowiska. Wartości NULL są niedozwolone. ,rs.[identyfikator_grupy]--ID grupy obciążenia, do której należy to zapytanie. Wartości NULL są niedozwolone. ,rs.[query_hash]--Binarna wartość skrótu jest obliczana dla zapytania i używana do identyfikowania zapytań o podobnej logice. Możliwe jest użycie skrótu zapytania do określenia użycia zasobów statystycznych dla zapytań, które różnią się tylko wartościami dosłownymi. ,rs.[query_plan_hash]--Binarna wartość skrótu jest obliczana dla planu wykonania zapytania i używana do identyfikowania podobnych planów wykonania. Możliwe jest użycie skrótu planu, aby znaleźć całkowity koszt zapytania z podobnymi planami wykonania. ,rs.[czas_rozpoczęcia_ostatniego_żądania] ,rs.[czas_zakończenia_ostatniego_żądania] ,rs.[całkowity_zaplanowany_czas] ,rs.[wykorzystanie_pamięci] ,rs.[nt_nazwa_użytkownika] zestawiaj Cyrylicę_Ogólny_CI_AS jako [nazwa_użytkownika_nt_główny] ,rs_General_nt_dorillAS jako [nt_dorillAS] .[identyfikator_zabezpieczeń] ,rs.[nazwa_interfejsu_klienta] zestawiaj Cyrillic_General_CI_AS jako [nazwa_interfejsu_klienta] ,rs.[wersja_klienta] ,rs.[id_procesu_hosta] ,rs.[czas_logowania] ,rs.[najnowsze_sql_uchwyt] ,rs.[identyfikator_rodzica] local_tcp_port] ,rs.[local_net_address] zestawiaj Cyrillic_General_CI_AS jako [local_net_address] ,rs.[client_tcp_port] ,rs.[client_net_address] zestawiaj Cyrillic_General_CI_AS jako [client_net_address] ,rs. readuncommitted) sprzężenie wewnętrzne [srv].[PlanQuery] jako pq na rs.[uchwyt_planu]=pq.[Uchwyt_planu] i rs.[sql_handle]=pq.[SqlHandle] sprzężenie wewnętrzne [srv].[SQLQuery] jako sq na sql .[SqlHandle]=pq.[SqlHandle] unia wszystkie SELECT rs.[status] sortuj 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] as decimal(18,3)) )/1000, 3) jako [total_elapsed_timeSec] ,DB_NAME(rs.[database_id]) zestawiaj Cyrillic_General_CI_AS jako [DBName],rs.[is_proces_użytkownika],rs.[nazwa_logowania] zestawiaj Cyrillic_General_CI_AS ,rs.[nazwa_programu_AS],rs. [host_name] sortuj Cyrillic_General_CI_AS ,sq.[TSQL] sortuj Cyrillic_General_CI_AS--,(wybierz tekst top(1) z 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]--Еliczba znaków w aktualnie wykonywanym pakiecie lub procedurze składowanej, w której uruchomiona jest bieżąca instrukcja . Może być używany razem z funkcjami dynamicznego zarządzania, takimi jak sql_handle, statement_end_offset i sys.dm_exec_sql_text, aby uzyskać aktualnie wykonywaną instrukcję dla zapytania. Dozwolone są wartości NULL. ,rs.[statement_end_offset]--Liczba znaków w aktualnie wykonywanym pakiecie lub procedurze składowanej, w której bieżąca instrukcja została zakończona. Może być używany razem z funkcjami dynamicznego zarządzania, takimi jak sql_handle, statement_end_offset i sys.dm_exec_sql_text, aby uzyskać aktualnie wykonywaną instrukcję dla zapytania. Dozwolone są wartości NULL. ,rs.[wait_type] sortuj Cyrillic_General_CI_AS — typ oczekiwania ,rs.[wait_time]--Jeśli zapytanie jest aktualnie zablokowane, kolumna zawiera bieżący czas oczekiwania (w ms). Dozwolone są wartości NULL. ,round(cast(rs.[wait_time] as decimal(18,3))/1000, 3) as [wait_timeSec] ,rs.[last_wait_type] sortuj Cyrillic_General_CI_AS--Jeśli zapytanie zostało wcześniej zablokowane, kolumna zawiera typ ostatnie oczekiwanie. Wartości NULL są niedozwolone. ,rs.[wait_resource] zestawiaj Cyrillic_General_CI_AS--Jeśli zapytanie jest aktualnie zablokowane, kolumna zawiera zasób, dla którego zapytanie oczekuje na zwolnienie. Wartości NULL są niedozwolone. ,rs.[liczba_otwartych_transakcji]--Liczba transakcji dostępnych dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[open_resultset_count] — liczba zestawów wynikowych dostępnych dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[id_transakcji]--Identyfikator transakcji, w której wykonywane jest zapytanie. Wartości NULL są niedozwolone. ,rs.[informacje_kontekstowe] ,rs.[procent_ukończenia] ,rs.[szacowany_czas_ukończenia] ,round(cast(rs.[szacowany_czas_ukończenia] jako dziesiętny(18,3))/1000, 3) jako [szacowany_czas_ukończenia] ,rs.[cpu_time] ]--Czas procesora (w ms) poświęcony na wykonanie zapytania. Wartości NULL są niedozwolone. ,round(cast(rs.[cpu_time] as decimal(18,3))/1000, 3) as [cpu_timeSec] ,rs.[total_elapsed_time]--Całkowity czas, który upłynął od otrzymania żądania (w ms). Wartości NULL są niedozwolone. ,rs.[scheduler_id] — Identyfikator programu planującego, który planuje dane zapytanie. Wartości NULL są niedozwolone. ,rs.[adres_zadania]--Adres bloku pamięci przeznaczonego na zadanie związane z tym zapytaniem. Dozwolone są wartości NULL. ,rs.[odczyty]--Liczba odczytów wykonanych przez dane zapytanie. Wartości NULL są niedozwolone. ,rs.[writes]--Liczba zapisów wykonanych przez dane zapytanie. Wartości NULL są niedozwolone. ,rs.[odczyty_logiczne]--Liczba odczytów logicznych wykonanych przez dane zapytanie. Wartości NULL są niedozwolone. ,rs.[rozmiar_tekstu] — ustawianie parametru TEXTSIZE dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[język] sortuj Cyrillic_General_CI_AS — ustawia język dla danego zapytania. Dozwolone są wartości NULL. ,rs.[format_daty] sortuj Cyrillic_General_CI_AS — ustawianie parametru DATEFORMAT dla danego zapytania. Dozwolone są wartości NULL. ,rs.[data_pierwsza]--ustawienie parametru DATEFIRST dla danego zapytania. Wartości NULL są niedozwolone. ,rs.[identyfikator_cytatu] ,rs.[arithabort] ,rs.[ansi_null_dflt_on] ,rs.[ansi_defaults] ,rs.[ansi_warnings] ,rs.[ansi_padding] ,rs.[ansi_nulls] ,rs.[concat_rs_null_y] .[poziom_izolacji_transakcji]--Poziom izolacji, który został utworzony wraz z transakcją dla danego zapytania. Wartości NULL są niedozwolone (nie określono 0, 1–5 wartości jest ustawianych rosnąco poziom izolacji transakcji). ,rs.[lock_timeout]--Limit czasu blokady dla danego zapytania (w ms). Wartości NULL są niedozwolone. ,round(cast(rs.[lock_timeout] as decimal(18,3))/1000, 3) as [lock_timeoutSec] ,rs.[deadlock_priority]--Wartość parametru DEADLOCK_PRIORITY dla danego zapytania. Wartość NULL jest niedozwolona. ,rs.[liczba_wierszy]--Liczba wierszy zwróconych klientowi dla danego zapytania. Wartość NULL jest niedozwolona. ,rs.[poprzedni_błąd]--Wystąpił poprzedni błąd podczas wykonywania zapytania. Wartości NULL są niedozwolone. ,rs.[poziom_gniazda]--Bieżący poziom zagnieżdżenia kodu wykonywany dla danego zapytania. Wartość NULL jest niedozwolona. ,rs.[granted_query_memory]--Liczba stron do wykonania zapytania. Wartość NULL jest niedozwolona. ,rs.[executing_managed_code]--wskazuje, czy dane zapytanie aktualnie wykonuje kod obiektu CLR (na przykład procedurę, typ lub wyzwalacz). Ten przełącznik jest ustawiany w czasie, gdy obiekt CLR znajduje się na stosie, nawet gdy kod Transact-SQL jest wywoływany ze środowiska. Wartości NULL są niedozwolone. ,rs.[identyfikator_grupy]--ID grupy obciążenia, do której należy to zapytanie. Wartości NULL są niedozwolone. ,rs.[query_hash]--Binarna wartość skrótu jest obliczana dla zapytania i używana do identyfikowania zapytań o podobnej logice. Możliwe jest użycie skrótu zapytania do określenia użycia zasobów statystycznych dla zapytań, które różnią się tylko wartościami dosłownymi. ,rs.[query_plan_hash]--Binarna wartość skrótu jest obliczana dla planu wykonania zapytania i używana do identyfikowania podobnych planów wykonania. Możliwe jest użycie skrótu planu, aby znaleźć całkowity koszt zapytania z podobnymi planami wykonania. ,rs.[czas_rozpoczęcia_ostatniego_żądania] ,rs.[czas_zakończenia_ostatniego_żądania] ,rs.[całkowity_zaplanowany_czas] ,rs.[wykorzystanie_pamięci] ,rs.[nt_nazwa_użytkownika] zestawiaj cyrylicę_General_CI_AS ,rs.[nt_domain] rs.CI_security_AS nazwa_interfejsu_klienta] zestawiaj Cyrillic_General_CI_AS ,rs.[wersja_klienta] ,rs.[identyfikator_procesu_hosta] ,rs.[czas_logowania] ,rs.[najnowsze_uchwyty_sql] ,rs.[identyfikator_połączenia_nadrzędnego] ,rs.[local_tcp_adres_portal_AS] ,rs. .[client_tcp_port] ,rs.[client_net_address] zestawiaj Cyrillic_General_CI_AS ,rs.[EndRegUTCDate] Z [srv].[RequestStatisticsArchive] jako rs with(readuncommitted) internal join [srv].[PlanQuery].=[plan_hand na rsle] pq.[PlanHandle] i rs.[sql_handle]=pq.[SqlHandle] sprzężenie wewnętrzne [srv].[SQLQuery] jako sq na sq.[SqlHandle]=pq.[SqlHandle]GO

    [/rozwiń]

  6. Wyświetl według wyboru aktualnie aktywnych żądań:
    [expand title=”Kod”]

    UŻYJ [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE widok [inf].[vRequestDetail] jako/*aktywne, gotowe do wykonania i oczekujące zapytania, a także te, które jawnie blokują inne sesje */z tbl0 jako ( wybierz ES .[identyfikator_sesji] ,ER.[id_blokowania_sesji] ,ER.[id_żądania] ,ER.[czas_rozpoczęcia] ,ER.[stan] ,ER.[polecenie] ,ER.[procent_ukończenia] ,DB_Name(połączenie(ER.[identyfikator_bazy_danych] , ES.[database_id])) jako [DBName] ,(wybierz top(1) tekst z sys.dm_exec_sql_text(ER.[sql_handle])) jako [TSQL] ,(wybierz top(1) [query_plan] z sys.dm_exec_query_plan (ER.[obsługa_planu])) jako [QueryPlan] ,ER.[typ_oczekiwania] ,ES.[czas_logowania] ,ES.[nazwa_hosta] ,ES.[nazwa_programu] ,ER.[czas_oczekiwania] ,ER.[typ_ostatniego_oczekiwania] ,ER .[wait_resource] ,ER.[liczba_otwartych_transakcji] ,ER.[open_resultset_count] ,ER.[identyfikator_transakcji] ,ER.[context_info] ,ER.[szacowany_czas_ukończenia] ,ER.[cpu_time] ,ER.[całkowity czas_okrążenia] sed_time] ,ER.[scheduler_id] ,ER.[adres_zadania] ,ER.[odczyty] ,ER.[zapis] ,ER.[logiczne_odczyty] ,ER.[rozmiar_tekstu] ,ER.[język] ,ER.[format_daty] ER.[pierwsza_data] ,ER.[cytowany_identyfikator] ,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.[poziom_izolacji_transakcji] ,ER.[limit_czasu_blokady] ,ER.[priorytet_zakleszczenia] ,ER.[liczba_wierszy] ,ER.[poprzedni_błąd] ,ER.[poziom_gniazda] ,ER.[przyznane_zapytanie,ER.[pamięć] 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_type] ,EC.[id_punktu_końcowego] ,EC.[opcja_szyfrowania] ,EC.[schemat_autoryzacji] ,EC.[powinowactwo_węzła] ,EC.[liczba_odczytów] ,WE.[liczba_zapisów] ,WE.[ostatni_odczyt],WE.[ostatni_zapis],WE.[rozmiar_pakietu_netowego],WE.[adres_sieciowy_klienta],WE.[port_klienta_tcp],WE.[lokalny_adres_netowy] ,WE.[lokalny],port_tcp .[id_połączenia_nadrzędnego] ,EC.[najnowsza_obsługa_sql] ,ES.[id_procesu_hosta] ,ES.[wersja_klienta] ,ES.[nazwa_interfejsu_klienta] ,ES.[id_zabezpieczeń] ,ES.[nazwa_logowania] ,ES.[domena_nt] ,ES.[ nt_nazwa_użytkownika] ,ES.[wykorzystanie_pamięci] ,ES.[całkowity_zaplanowany_czas] ,ES.[czas_rozpoczęcia_ostatniego_żądania] ,ES.[czas_zakończenia_ostatniego_żądania] ,ES.[is_proces_użytkownika] ,ES.[oryginalny_identyfikator_zabezpieczeń] ,ES. ,ES.[last_unsuccessful_logon] ,ES.[unsuccessful_logons] ,ES.[authenticating_database_id] ,ER.[sql_handle] ,ER.[statement_start_offset] ,ER.[statement_end_offset] ,ER_. , ES.[database_id]) jako [database_id] ,ER.[user_id] ,ER.[connection_id] from s ys.dm_exec_requests ER z(readuncommitted) prawe dołączenie sys.dm_exec_sessions ES z(readuncommitted) na ES.session_id =ER.session_id lewe dołączenie sys.dm_exec_connections EC z(readuncommitted) na EC.session_id (wybierz =ES.session_id), [identyfikator_sesji] ,[id_sesji_blokującej] ,[id_żądania] ,[czas_rozpoczęcia] ,[status] ,[polecenie] ,[procent_ukończenia] ,[DBName] ,[TSQL] ,[QueryPlan] ,[typ_oczekiwania] ,[czas_logowania] ,[nazwa_hosta ] ,[nazwa_programu] ,[czas_oczekiwania] ,[rodzaj_ostatniego_oczekiwania] ,[zasób_oczekiwania] ,[liczba_otwartych_transakcji] ,[liczba_otwartych_wyników] ,[id_transakcji] ,[informacje o_kontekście] ,[szacowany_czas_ukończenia] ,[czas_cpu], ,,d_czasu, [czas_zakończenia] [adres_zadania] ,[odczyty] ,[zapis] ,[odczyty_logiczne] ,[rozmiar_tekstu] ,[język] ,[format_daty] ,[pierwsza_data] ,[identyfikator_cytatu] ,[arithabort] ,[ansi_null_dflt_ on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[,wstępny_liczba_min] ,[ ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[najnowsze_id_sesji] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] [chemizacja_systemu”],[en powinowactwo_węzła] ,[liczba_odczytań] ,[liczba_zapisów] ,[ostatni_odczyt] ,[ostatni_zapis] ,[rozmiar_pakietu_sieciowego] ,[adres_sieci_klienta] ,[port_klienta_tcp] ,[adres_lokalny_sieciowy] ,[najbardziej_lokalny,[identyfikator_pliku_hosta],[port_lokalny_hosta]] ,[wersja_klienta] ,[nazwa_interfejsu_klienta] ,[identyfikator_zabezpieczeń] ,[nazwa_logowania] ,[domena_nt] , [nt_user_name], [pamięć_usage], [total_scheduled_time], [last_request_start_time], [last_request_end_time], [is_user_process], [original_security_id], [original_login_name], [last_successful_logon], [is_user_unsUls_UnsUls_Logon], [oryginał_login_name) sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[database_id] ,[user_id] ,[connection_id] from tbl0 gdzie [status] in ('suspended', 'running', 'runnable')), tbl_group as ( wybierz [blocking_session_id] z tabeli, gdzie [blocking_session_id]<>0 grupuj według [blocking_session_id]) wybierz [blocking_session_id] ,[blocking_session_id] ,[request_id] ,[start_time] ,[status] ,[command] ,[procent_complete] ,[ DBName] ,[TSQL] ,[QueryPlan] ,[typ_oczekiwania] ,[czas_logowania] ,[nazwa_hosta] ,[nazwa_programu] ,[czas_oczekiwania] ,[typ_ostatniego_oczekiwania] ,[zasób_oczekiwania] ,[transakcje_otwarte ction_count] ,[open_resultset_count] ,[id_transaction_id] ,[context_info] ,[szacowany_czas_ukończenia] ,[cpu_time] ,[całkowity_upływ_czasu] ,[harmonogram_id] ,[adres_zadania] ,[odczyty] ,[tekst_logiczny] ,[język] ,[format_daty] ,[pierwsza_data] ,[identyfikator_cytatu] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls_null_null_transakcja,[conlation_ansi_nulls]_null_conlation , lock_timeout] ,[deadlock_priority] ,[liczba_wierszy] ,[poprzedni_błąd] ,[poziom_zagnieżdżenia] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[connect_most_recent] ,[typ_protokołu] ,[wersja_protokołu] ,[id_punktu_końcowego] ,[opcja_szyfrowania] ,[schemat_uwierzytelniania] ,[powinowactwo_węzła] ,[liczba_odczytań] ,[liczba_zapisów] ,[ostatni_odczyt] ,[ostatni_zapis] ,[rozmiar_pakietu_sieciowego] ,[adres_sieciowy_klienta] ,[port_klienta_tcp] ,[adres_sieciowy_lokalnego_tcp] ,[największy,_port_lokalny],[identyfikator_połączenia_tcp] identyfikator_procesu_hosta] ,[wersja_klienta] ,[nazwa_interfejsu_klienta] ,[id_zabezpieczeń] ,[nazwa_logowania] ,[domena_nt] ,[nazwa_użytkownika_nt] ,[wykorzystanie_pamięci] ,[całkowity_zaplanowany_czas] ,[last_request_start_time_proces_gin] ,[last_request_start_time_proces] ,[last_request_start_time_proces] ,[nazwa_oryginalnego_loginu] ,[ostatni_pomyślny_logon] ,[ostatni_nieudany_logon] ,[nieudany_logons] ,[identyfikator_bazy_uwierzytelniających_danych] ,[uchwyt_sql] ,[oświadczenie_początkowe_ustawienie_stanu_użytkownika,_koniec_przesunięcia_ręki] ,[przesunięcie_do_końca_ręki],[przesunięcie_do_końca_ręki] allselect tbl0.[id_sesji] ,tbl0.[id_blokowania_sesji] ,tbl0.[id_żądania] ,tbl0.[ start_time] ,tbl0.[status] ,tbl0.[polecenie] ,tbl0.[procent_ukończenia] ,tbl0.[DBName] ,tbl0.[TSQL] ,tbl0.[QueryPlan] ,tbl0.[Typ_oczekiwania] ,tbl0.[czas_logowania] ,tbl0.[nazwa_hosta] ,tbl0.[nazwa_programu] ,tbl0.[czas_oczekiwania] ,tbl0.[typ_ostatniego_oczekiwania] ,tbl0.[zasób_oczekiwany] ,tbl0.[liczba_otwartych_transakcji] ,tbl0.[liczba_zestawu_otwartych_wyników] ,tbl0.[liczba_transakcji] .[context_info] ,tbl0.[estimated_completion_time] ,tbl0.[cpu_time] ,tbl0.[total_elapsed_time] ,tbl0.[scheduler_id] ,tbl0.[task_address] ,tbl0.[reads] ,tbl0.[writes] ,tbl0.[ logical_reads] ,tbl0.[text_size] ,tbl0.[language] ,tbl0.[date_format] ,tbl0.[date_first] ,tbl0.[quoted_identifier] ,tbl0.[arithabort] ,tbl0.[ansi_null_dflt_on] ,tbl0.[ansi_defaults] ,tbl0.[ansi_warnings] ,tbl0.[ansi_padding] ,tbl0.[ansi_nulls] ,tbl0.[concat_null_yields_null] ,tbl0.[transaction_isolation_level] ,tbl0.[lock_timeout] ,tbl0.[deadlock_priority] ,tbl0.[row_count] ,tbl0.[prev_error] ,tbl0.[nest_level] ,tbl0.[granted_query_memory] ,tbl0.[executing_managed_code] ,tbl0.[group_id] ,tbl0.[query_hash] ,tbl0.[query_plan_hash] ,tbl0.[most_recent_session_id] ,tbl0.[connect_time] ,tbl0.[net_transport] ,tbl0.[protocol_type] ,tbl0.[protocol_version] ,tbl0.[endpoint_id] ,tbl0.[encrypt_option] ,tbl0.[auth_scheme] ,tbl0.[node_affinity] ,tbl0.[num_reads] ,tbl0.[num_writes] ,tbl0.[last_read] ,tbl0.[last_write] ,tbl0.[net_packet_size] ,tbl0.[client_net_address] ,tbl0.[client_tcp_port] ,tbl0.[local_net_address] ,tbl0.[local_tcp_port] ,tbl0.[parent_connection_id] ,tbl0.[most_recent_sql_handle] ,tbl0.[host_process_id] ,tbl0.[client_version] ,tbl0.[client_interface_name] ,tbl0.[se curity_id] ,tbl0.[login_name] ,tbl0.[nt_domain] ,tbl0.[nt_user_name] ,tbl0.[memory_usage] ,tbl0.[total_scheduled_time] ,tbl0.[last_request_start_time] ,tbl0.[last_request_end_time] ,tbl0.[is_user_process] ,tbl0.[original_security_id] ,tbl0.[original_login_name] ,tbl0.[last_successful_logon] ,tbl0.[last_unsuccessful_logon] ,tbl0.[unsuccessful_logons] ,tbl0.[authenticating_database_id] ,tbl0.[sql_handle] ,tbl0.[statement_start_offset] ,tbl0.[statement_end_offset] ,tbl0.[plan_handle] ,tbl0.[database_id] ,tbl0.[user_id] ,tbl0.[connection_id]from tbl_group as tginner join tbl0 on tg.blocking_session_id=tbl0.session_id;GO

    [/expand]

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

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

[expand title=”Code”]

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

[/expand]

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

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

Implementation of the table

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

Implementation of the stored procedure

[expand title=”Code”]

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

[/expand]

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

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

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

Implementation of the view

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

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

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

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

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

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

Podsumowanie

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

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

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

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najlepsze sposoby użycia instrukcji SQL DELETE w tabeli SQL

  2. Jak tworzyć zadania w edycji SQL Server Express

  3. Uruchamianie pakietu SSIS przy użyciu dtexec

  4. Ogranicz połączenie SQL Server do określonego adresu IP

  5. Jak mogę przejść do przechowywanej procedury SQL Server z mojego kodu C#?