Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Triển khai một Chỉ báo Hiệu suất Máy chủ MS SQL Chung

Giới thiệu

Thường cần phải tạo một chỉ báo hiệu suất sẽ hiển thị hoạt động cơ sở dữ liệu liên quan đến khoảng thời gian trước đó hoặc ngày cụ thể. Trong bài viết có tiêu đề “Triển khai chỉ báo hiệu suất máy chủ SQL cho truy vấn, thủ tục được lưu trữ và trình kích hoạt”, chúng tôi đã cung cấp một ví dụ về việc triển khai chỉ báo này.

Trong bài viết này, chúng tôi sẽ mô tả một cách đơn giản khác để theo dõi thời gian thực hiện truy vấn và thời gian thực thi truy vấn cũng như cách truy xuất các kế hoạch thực thi cho từng thời điểm.

Phương pháp này đặc biệt hữu ích trong trường hợp bạn cần tạo báo cáo hàng ngày, vì vậy bạn không chỉ có thể tự động hóa phương pháp mà còn thêm nó vào báo cáo với các chi tiết kỹ thuật tối thiểu.

Trong bài viết này, chúng ta sẽ khám phá một ví dụ về việc triển khai chỉ báo hiệu suất phổ biến này, trong đó Tổng thời gian đã trôi qua sẽ đóng vai trò là số liệu.

Giải pháp

Đầu tiên, chúng tôi cung cấp một thuật toán chung:

1) Chụp nhanh các truy vấn đang hoạt động
2) Lưu kết quả
3) Thực hiện phân tích tổng hợp và lưu kết quả vào bảng vào cuối ngày
4) Thực hiện phân tích so sánh dữ liệu nhận được

Bây giờ, chúng tôi sẽ cung cấp một số chi tiết.

Để chụp nhanh các truy vấn đang hoạt động, hãy tạo các bảng sau:

  1. Bảng các kế hoạch truy vấn
     SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG KẾ HOẠCH ONGOCREATE [srv]. [PlanQuery] ([PlanHandle] [varbinary] (64) NOT NULL, [SQLHandle] [varbinary] (64) NOT NULL, [QueryPlan] [xml] NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_PlanQuery] PRIMARY KEY CLUSTERED ([SQLHandle] ASC, [PlanHandle] ASC) WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE_ OFF, IGNORECOMPUTE_DORE , ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GOALTER TABLE [srv]. [PlanQuery] ADD CONSTRAINT [DF_PlanQuery_InsertUTCDate] DEFAULTDate (get] GOutcdate (pre)> 
  2. Bảng truy vấn
     USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]. [SQLQuery] ([SQLHandle] [varbinary] (64) NOT NULL, [TSQL] [nvarchar] (max) NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_SQLQuery] PRIMARY KEY CLUSTERED ([SQLHandle] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLKSARY_PAGE) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GOALTER TABLE [srv]. [SQLQuery] ADD CONSTRAINT [DF_SQLQuery_InsertUTCDate] DEFAULT (getutcdate ()) FOR [InsertUTCDate] GO 
  3. Bảng có ảnh chụp nhanh các truy vấn đang hoạt động:
    [expand title =”Code”]

     USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG ONGOCREATE [srv]. [RequestSt Statistics] ([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, [blocks_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, [phần trăm_complete] [thực] NULL, [ước tính_completion_time] [bigint] NULL, [cpu_time] [int] NULL, [total_elapsed_time] [int] NULL, [Scheduler_id] [ int] NULL, [task_address] [varbinary] (8) NULL, [đọc] [bigint] NULL, [ghi] [bigint] NULL, [logic_reads] [bigint] NULL, [text_size] [int] NULL, [language] [nvarchar] (128) NULL, [date_format] [nvarchar ] (3) NULL, [date_first] [smallint] NULL, [quote_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_priasty] [int] NULL, [row_count] [bigint] NULL, [prev_error] [int] NULL, [nest_level] [int] NULL, [powers_query_memory] [int] NULL, [execute_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, [mã hóa_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_schedised_time] [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, [failed_logons] [bigint] NULL, [authenticating_database_id] [int ] NULL, [InsertUTCDate] [datetime] NOT NULL, [EndRegUTCDate] [datetime] NULL) ON [PRIMARY] GOALTER TABLE [srv]. [RequestSt Statistics] THÊM CONSTRAINT [DF_RequestSt Statistics_InsertOSUTCDate] DEFAULT (getutcdate () ANSI) FOR [InsertSI ONGOCREATE CLUSTERED INDEX [indRequest] ON [srv]. [RequestSt Statistics] ([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) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, ONLINE =OFF, ALLOW_ROW_LOCKS =ON, ALLOWARY_PAGE_LOCKS =ON) ANSI_PADDING CHỈ SỐ KHÔNG ĐƯỢC ĐIỀU CHỈNH ONGOCREATE [indPlanQuery] ON [srv]. [RequestSt Statistics] ([plan_handle ] ASC, [sql_handle] ASC) WHERE ([sql_handle] KHÔNG ĐẦY ĐỦ VÀ [plan_handle] KHÔNG ĐẦY ĐỦ) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DROP_EXISTING =OFF, ONLINE =OFF, ALLOW_ROW, ONLINE =OFF, ALLOW_ROW ALLOW_PAGE_LOCKS =ON) ON [PRIMARY] GO 

    [/ mở rộng]

    Theo cách tương tự, chúng tôi tạo một bảng cho kho lưu trữ [srv]. [RequestSt StatisticsArchive].

  4. Bảng với tổng số thống kê hàng ngày
     USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]. [TSQL_DAY_St Statistics] ([command] [nvarchar] (32) NOT NULL, [DBName] [nvarchar] (128) KHÔNG NULL, [PlanHandle] [varbinary] (64) NOT NULL, [SqlHandle] [varbinary] (64) NOT NULL, [execute_count] [bigint] NOT NULL, [min_wait_timeSec] [decimal] (23, 8) NOT NULL, [min_estimated_completion_timeSec] [decimal] (23, 8) NOT NULL, [min_cpu_timeSec] [decimal] (23, 8) NOT NULL, [min_total_elapsed_timeSec] [decimal] (23, 8) NOT NULL, [min_lock_timeoutSec] [decimal] (23 , 8) NOT NULL, [max_wait_timeSec] [decimal] (23, 8) NOT NULL, [max_estimated_completion_timeSec] [decimal] (23, 8) NOT NULL, [max_cpu_timeSec] [decimal] (23, 8) NOT NULL, [max_total_elapsed_timeSec ] [decimal] (23, 8) NOT NULL, [max_lock_timeoutSec] [decimal] (23, 8) NOT NULL, [DATE] [date] NOT NULL) ON [PRIMARY] GOALTER TABLE [srv]. [TSQL_DAY_St Statistics] ADD CONSTRAINT [DF_TSQL_DAY_St Statistics_DATE] DEFAULT (getutcdate ()) CHO [DATE] GOCREATE NONCLUSTERED INDEX [indDATE] ON [srv]. [TSQL_DAY_St Statistics] ([DATE] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, DOW_P_EXISTING =OFF, ONLINE =OFF, ALLKSAGE =BẬT) BẬT [CHÍNH] ĐI 
  5. Xem theo ảnh chụp nhanh được ghi lại của các truy vấn đang hoạt động
    [expand title =”Code”]

     USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE chế độ xem [srv]. [vRequestStosystem] dưới dạng / * thống kê truy vấn * / SELECT rs. [status] đối chiếu Cyrillic_General_CI_AS thành [status], rs. [InsertUTCDate], rs. [InsertUTCDate], rs. ], rs. [command] đối chiếu Cyrillic_General_CI_AS thành [command], rs. [session_id], rs. [blocks_session_id], round (cast (rs. [total_elapsed_time] as decimal (18,3)) / 1000, 3) as [ total_elapsed_timeSec], DB_NAME (rs. [database_id]) đối chiếu Cyrillic_General_CI_AS thành [DBName], rs. [is_user_process], rs. [login_name] đối chiếu Cyrillic_General_CI_AS thành [login_name], rs. [host_name] đối chiếu Cyrillic_General_CI_AS thành [host_name], sq. [TSQL] đối chiếu Cyrillic_General_CI_AS thành [TSQL] -, (chọn văn bản trên cùng (1) từ sys.dm_exec_sql_text ([sql_handle])) thành [TSQL], pq. ], rs. [plan_handle], rs. [user_id], rs. [connection_id], rs. [database_id], rs. [sql_handle], rs. [ statement_start_offset] - Số lượng ký tự trong gói hiện đang thực thi hoặc thủ tục được lưu trữ trong đó câu lệnh hiện tại được chạy. Nó có thể được sử dụng cùng với các hàm quản lý động, chẳng hạn như sql_handle, statement_end_offset và sys.dm_exec_sql_text để lấy câu lệnh hiện đang thực thi cho truy vấn. Giá trị NULL được cho phép. , rs. [statement_end_offset] - Số ký tự trong gói đang thực thi hoặc thủ tục được lưu trữ, trong đó câu lệnh hiện tại đã được hoàn thành. Nó có thể được sử dụng cùng với các hàm quản lý động, chẳng hạn như sql_handle, statement_end_offset và sys.dm_exec_sql_text để lấy câu lệnh hiện đang thực thi cho truy vấn. Giá trị NULL được cho phép. , rs. [wait_type] đối chiếu Cyrillic_General_CI_AS là [wait_type] - loại chờ, rs. [wait_time] - Nếu truy vấn hiện bị chặn, cột chứa thời gian chờ (tính bằng mili giây). Giá trị NULL không được phép. , round (cast (rs. [wait_time] as decimal (18,3)) / 1000, 3) as [wait_timeSec], rs. [last_wait_type] collate Cyrillic_General_CI_AS as [last_wait_type] - Nếu truy vấn bị chặn trước đó, cột chứa loại thời gian chờ mới nhất. Giá trị NULL không được phép. , rs. [wait_resource] đối chiếu Cyrillic_General_CI_AS là [wait_resource] - Nếu truy vấn hiện đang bị chặn, cột cho biết tài nguyên mà truy vấn đang chờ phát hành. Giá trị NULL không được phép. , rs. [open_transaction_count] - Số lượng giao dịch có sẵn cho truy vấn này. Giá trị NULL không được phép. , rs. [open_resultset_count] - Số lượng tập hợp kết quả có sẵn cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [transaction_id] - Mã định danh giao dịch của truy vấn hiện đang thực thi. Giá trị NULL không được phép. , rs. [context_info], rs. [phần trăm_complete], rs. [ước tính_completion_time], vòng (truyền (rs. [ước tính_completion_time] dưới dạng thập phân (18,3)) / 1000, 3) dưới dạng [ước tính_completion_timeSec], rs. [cpu_time ] - Thời gian CPU (tính bằng mili giây) dành để thực hiện truy vấn. Giá trị NULL không được phép. , round (cast (rs. [cpu_time] as decimal (18,3)) / 1000, 3) as [cpu_timeSec], rs. [total_elapsed_time] - Tổng thời gian trôi qua kể từ khi nhận được yêu cầu (tính bằng mili giây). Giá trị NULL không được phép. , rs. [Scheduler_id] - Một mã định danh của bộ lập lịch lập kế hoạch cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [task_address] - Địa chỉ của khối bộ nhớ dành riêng cho nhiệm vụ liên quan đến yêu cầu này. Giá trị NULL được cho phép. , rs. [lần đọc] - Số lần đọc được thực hiện bởi truy vấn đã cho. Giá trị NULL được cho phép. , rs. [write] - Số lần ghi được thực hiện bởi truy vấn đã cho. Giá trị NULL không được phép. , rs. [logic_reads] - Số lần đọc logic được thực thi bởi truy vấn đã cho. Giá trị NULL không được phép. , rs. [text_size] - Đặt tham số TEXTSIZE cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [language] đối chiếu Cyrillic_General_CI_AS làm [ngôn ngữ] - Đặt ngôn ngữ cho truy vấn đã cho. Giá trị NULL được cho phép. , rs. [date_format] đối chiếu Cyrillic_General_CI_AS thành [date_format] - Đặt tham số DATEFORMAT cho truy vấn đã cho. Giá trị NULL được cho phép. , rs. [date_first] - Đặt tham số DATEFIRST cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [quote_identifier], rs. [arithabort], rs. [ansi_null_dflt_on], rs. [ansi_defaults], rs. [ansi_warnings], rs. [ansi_padding], rs. [ansi_nulls], rs. . [transaction_isolation_level] - mức cách ly giao dịch cho truy vấn đã cho. Giá trị NULL không được phép (0 không được chỉ định, 1 - 5 giá trị được đặt theo thứ tự tăng dần của mức cách ly giao dịch). , rs. [lock_timeout] - Khóa thời gian chờ cho truy vấn đã cho (tính bằng mili giây). Giá trị NULL không được phép. , round (cast (rs. [lock_timeout] as decimal (18,3)) / 1000, 3) as [lock_timeoutSec], rs. [deadlock_priasty] - Giá trị của tham số DEADLOCK_PRIORITY cho truy vấn nhất định. Giá trị NULL không được phép. , rs. [row_count] - Số hàng được trả lại cho máy khách cho truy vấn này. Giá trị NULL không được phép. , rs. [prev_error] - Đã xảy ra lỗi trước đó khi thực hiện truy vấn. Giá trị NULL không được phép. , rs. [nest_level] - Mức độ lồng mã hiện tại được thực thi cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [powers_query_memory] - Số trang để thực hiện truy vấn. Giá trị NULL không được phép. , rs. [execute_managed_code] - Cho biết nếu truy vấn nhất định hiện đang thực thi mã đối tượng CLR (ví dụ:thủ tục, loại hoặc trình kích hoạt). Chuyển đổi này được đặt khi đối tượng CLR ở trong ngăn xếp, ngay cả khi mã Transact-SQL được gọi từ môi trường. Giá trị NULL không được phép. , rs. [group_id] - ID của nhóm khối lượng công việc chứa truy vấn này. Giá trị NULL không được phép. , rs. [query_hash] - Giá trị băm nhị phân được tính toán cho truy vấn và được sử dụng để xác định các truy vấn có logic tương tự. Có thể sử dụng hàm băm truy vấn để xác định việc sử dụng tài nguyên thống kê cho các truy vấn chỉ khác nhau về giá trị chữ của chúng. , rs. [query_plan_hash] - Giá trị băm nhị phân được tính toán cho kế hoạch thực thi truy vấn và được sử dụng để xác định các kế hoạch thực thi tương tự. Có thể sử dụng băm kế hoạch để tìm tổng chi phí truy vấn với các kế hoạch thực hiện tương tự. , rs. [last_request_start_time], rs. [last_request_end_time], rs. [total_schedised_time], rs. [memory_usage], rs. [nt_user_name] đối chiếu Cyrillic_General_CI_AS thành [nt_user_name], rs. . [security_id], rs. [client_interface_name] đối chiếu Cyrillic_General_CI_AS thành [client_interface_name], rs. [client_version], rs. [host_process_id], rs. [login_time], rs. [most_recent_sql_handle], rs. [parent_connection_id] local_tcp_port], rs. [local_net_address] đối chiếu Cyrillic_General_CI_AS thành [local_net_address], rs. [client_tcp_port], rs. [client_net_address] đối chiếu Cyrillic_General_CI_AS thành [client_net_address] FROM request, rs. readuncomiled) tham gia bên trong [srv]. [PlanQuery] dưới dạng pq trên rs. [plan_handle] =pq. [PlanHandle] và rs. [sql_handle] =pq. [sqlHandle] tham gia bên trong [srv]. [SQLQuery] dưới dạng sq trên sq . [SqlHandle] =pq. [SqlHandle] kết hợp tất cả các SELECT rs. [Status] collate Cyrillic_General_ CI_AS, rs. [InsertUTCDate], rs. [Start_time], rs. [Command] đối chiếu Cyrillic_General_CI_AS, rs. [Session_id], rs. [Blocks_session_id], round (cast (rs. [Total_elapsed_time] dưới dạng thập phân (18,3)) ) / 1000, 3) dưới dạng [total_elapsed_timeSec], DB_NAME (rs. [Database_id]) đối chiếu Cyrillic_General_CI_AS thành [DBName], rs. [Is_user_process], rs. [Login_name] collate Cyrillic_General_CI_AS, rsate Cyrillic_name. [host_name] đối chiếu Cyrillic_General_CI_AS, sq. [TSQL] đối chiếu Cyrillic_General_CI_AS -, (chọn văn bản trên cùng (1) từ sys.dm_exec_sql_text ([sql_handle])) thành [TSQL], pq. [QueryPlan], rs. rs. [user_id], rs. [connection_id], rs. [database_id], rs. [sql_handle], rs. [statement_start_offset] - Е số ký tự trong gói hiện đang thực thi hoặc thủ tục được lưu trữ trong đó câu lệnh hiện tại được chạy . Nó có thể được sử dụng cùng với các chức năng quản lý động, chẳng hạn như sql_handle, statement_end_offset và sys.dm_exec_sql_text để lấy câu lệnh hiện đang thực thi cho truy vấn. Giá trị NULL được cho phép. , rs. [statement_end_offset] - Số ký tự trong gói hiện đang thực thi hoặc thủ tục được lưu trữ trong đó câu lệnh hiện tại đã được hoàn thành. Nó có thể được sử dụng cùng với các hàm quản lý động, chẳng hạn như sql_handle, statement_end_offset và sys.dm_exec_sql_text để lấy câu lệnh hiện đang thực thi cho truy vấn. Giá trị NULL được cho phép. , rs. [wait_type] đối chiếu Cyrillic_General_CI_AS - loại chờ, rs. [wait_time] - Nếu truy vấn hiện bị chặn, cột chứa thời gian chờ hiện tại (tính bằng mili giây). Giá trị NULL được cho phép. , round (cast (rs. [wait_time] as decimal (18,3)) / 1000, 3) as [wait_timeSec], rs. [last_wait_type] collate Cyrillic_General_CI_AS - Nếu truy vấn bị chặn trước đó, cột chứa loại sự chờ đợi mới nhất. Giá trị NULL không được phép. , rs. [wait_resource] collate Cyrillic_General_CI_AS - Nếu truy vấn hiện đang bị chặn, cột chứa tài nguyên mà truy vấn đang chờ phát hành. Giá trị NULL không được phép. , rs. [open_transaction_count] - Số lượng giao dịch có sẵn cho truy vấn nhất định. Giá trị NULL không được phép. , rs. [open_resultset_count] - Số lượng tập hợp kết quả có sẵn cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [transaction_id] - Định danh của giao dịch mà truy vấn đang được thực thi. Giá trị NULL không được phép. , rs. [context_info], rs. [phần trăm_complete], rs. [ước tính_completion_time], vòng (truyền (rs. [ước tính_completion_time] dưới dạng thập phân (18,3)) / 1000, 3) dưới dạng [ước tính_completion_timeSec], rs. [cpu_time ] - Thời gian CPU (tính bằng mili giây) dành cho việc thực thi truy vấn. Giá trị NULL không được phép. , round (cast (rs. [cpu_time] as decimal (18,3)) / 1000, 3) as [cpu_timeSec], rs. [total_elapsed_time] - Tổng thời gian trôi qua kể từ khi nhận được yêu cầu (tính bằng mili giây). Giá trị NULL không được phép. , rs. [Scheduler_id] - Định danh của bộ lập lịch trình lập kế hoạch cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [task_address] - Địa chỉ của khối bộ nhớ dành riêng cho nhiệm vụ liên quan đến truy vấn này. Giá trị NULL được cho phép. , rs. [lần đọc] - Số lần đọc được thực hiện bởi truy vấn đã cho. Giá trị NULL không được phép. , rs. [write] - Số lần ghi được thực hiện bởi truy vấn đã cho. Giá trị NULL không được phép. , rs. [logic_reads] - Số lần đọc logic được thực hiện bởi truy vấn đã cho. Giá trị NULL không được phép. , rs. [text_size] - Đặt tham số TEXTSIZE cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [language] collate Cyrillic_General_CI_AS - Đặt ngôn ngữ cho truy vấn đã cho. Giá trị NULL được cho phép. , rs. [date_format] collate Cyrillic_General_CI_AS - Đặt tham số DATEFORMAT cho truy vấn đã cho. Giá trị NULL được cho phép. , rs. [date_first] - Đặt tham số DATEFIRST cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [quote_identifier], rs. [arithabort], rs. [ansi_null_dflt_on], rs. [ansi_defaults], rs. [ansi_warnings], rs. [ansi_padding], rs. [ansi_nulls], rs. . [transaction_isolation_level] - Mức cách ly được tạo cùng với giao dịch cho truy vấn đã cho. Giá trị NULL không được phép (0 không được chỉ định, 1 - 5 giá trị được đặt tăng dần mức cách ly giao dịch). , rs. [lock_timeout] - Khóa thời gian chờ cho truy vấn đã cho (tính bằng mili giây). Giá trị NULL không được phép. , round (cast (rs. [lock_timeout] as decimal (18,3)) / 1000, 3) as [lock_timeoutSec], rs. [deadlock_priasty] - Giá trị của tham số DEADLOCK_PRIORITY cho truy vấn nhất định. Giá trị NULL không được phép. , rs. [row_count] - Số hàng được trả lại cho máy khách cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [prev_error] - Đã xảy ra lỗi trước đó khi thực hiện truy vấn. Giá trị NULL không được phép. , rs. [nest_level] - Mức lồng mã hiện tại được thực thi cho truy vấn đã cho. Giá trị NULL không được phép. , rs. [powers_query_memory] - Số trang để thực hiện truy vấn. Giá trị NULL không được phép. , rs. [execute_managed_code] - cho biết nếu truy vấn nhất định hiện đang thực thi mã đối tượng CLR (ví dụ:thủ tục, loại hoặc trình kích hoạt). Chuyển đổi này được đặt trong thời gian đối tượng CLR ở trong ngăn xếp, ngay cả khi mã Transact-SQL được gọi từ môi trường. Giá trị NULL không được phép. , rs. [group_id] - ID của nhóm khối lượng công việc chứa truy vấn này. Giá trị NULL không được phép. , rs. [query_hash] - Giá trị băm nhị phân được tính toán cho truy vấn và được sử dụng để xác định các truy vấn có logic tương tự. Có thể sử dụng hàm băm truy vấn để xác định việc sử dụng tài nguyên thống kê cho các truy vấn chỉ khác nhau về giá trị chữ của chúng. , rs. [query_plan_hash] - Giá trị băm nhị phân được tính toán cho kế hoạch thực thi truy vấn và được sử dụng để xác định các kế hoạch thực thi tương tự. Có thể sử dụng băm kế hoạch để tìm tổng chi phí truy vấn với các kế hoạch thực hiện tương tự. , rs. [last_request_start_time], rs. [last_request_end_time], rs. [total_schedised_time], rs. [memory_usage], rs. [nt_user_name] collate Cyrillic_General_CI_AS, rs. [nt_domain] collate Cyrillic_rs. 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_công_tin], rs. . [client_tcp_port], rs. [client_net_address] đối chiếu Cyrillic_General_CI_AS, rs. [EndRegUTCDate] FROM [srv]. [RequestSt StatisticsArchive] dưới dạng rs với (readuncomiled) Internal join [srv]. [PlanQuery] as pq on lers]. pq. [PlanHandle] và rs. [sql_handle] =pq. [SqlHandle] internal join [srv]. [SQLQuery] as sq on sq. [SqlHandle] =pq. [SqlHandle] GO 

    [/ mở rộng]

  6. Xem theo lựa chọn các yêu cầu đang hoạt động hiện tại:
    [expand title =”Code”]

     USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE chế độ xem [inf]. [vRequestDetail] dưới dạng / * hoạt động, sẵn sàng được thực thi và các truy vấn đang chờ xử lý, cũng như các truy vấn chặn rõ ràng các phiên khác * / với tbl0 as (chọn ES . [session_id], ER. [blocks_session_id], ER. [request_id], ER. [start_time], ER. [status], ER. [command], ER. [phần trăm_complete], DB_Name (liên kết (ER. [database_id] , ES. [Database_id])) dưới dạng [DBName], (chọn văn bản trên cùng (1) từ sys.dm_exec_sql_text (ER. [Sql_handle])) dưới dạng [TSQL], (chọn trên cùng (1) [query_plan] từ sys.dm_exec_query_plan (ER. [Plan_handle])) dưới dạng [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. [wish_completion_time], ER. [cpu_time], ER. [total_elap sed_time], ER. [Scheduler_id], ER. [task_address], ER. [read], ER. [write], ER. [logic_reads], ER. [text_size], ER. [language], ER. [date_format] , ER. [Date_first], ER. [Quote_identifier], ER. [Arithabort], ER. [Ansi_null_dflt_on], ER. [Ansi_defaults], ER. [Ansi_warnings], ER. [Ansi_padding], ER. [Ansi_nulls], ER . [concat_null_yields_null], ER. [transaction_isolation_level], ER. [lock_timeout], ER. [deadlock_priasty], ER. [row_count], ER. [prev_error], ER. [nest_level], ER. [powers_query_memory], ER. [ execute_managed_code], ER. [group_id], ER. [query_hash], ER. [query_plan_hash], EC. [most_recent_session_id], EC. [connect_time], EC. [net_transport], EC. [protocol_type], EC. [protocol_version] , EC. [Endpoint_id], EC. [Encode_option], EC. [Auth_scheme], EC. [Node_affinity], EC. [Num_reads] , EC. [Num_writes], EC. [Last_read], EC. [Last_write], EC. [Net_packet_size], EC. [Client_net_address], EC. [Client_tcp_port], EC. [Local_net_address], EC. [Local_tcp_port], 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_schedised_time], ES. [last_request_start_time], ES. [last_request_end_time], ES. [is_user_process], ES. [original_security_id], ES. [original_login_name], ESful. [last_gon_success , ES. [Last_unsuccessful_logon], ES. [Failed_logons], ES. [Authenticating_database_id], ER. [Sql_handle], ER. [Statement_start_offset], ER. [Statement_end_offset], ER. [Plan_handle], Coalesce (ER. [Database_id] , ES. [Database_id]) dưới dạng [database_id], ER. [User_id], ER. [Connection_id] từ s ys.dm_exec_requests ER với (đã đọc) tham gia bên phải sys.dm_exec_sessions ES với (đã đọc) trên ES.session_id =ER.session_id tham gia bên trái sys.dm_exec_connections EC với (đã đọc) trên EC.session_id =ES.session_id), tbl as (select [session_id], [blocks_session_id], [request_id], [start_time], [status], [command], [phần trăm_complete], [DBName], [TSQL], [QueryPlan], [wait_type], [login_time], [host_name ], [program_name], [wait_time], [last_wait_type], [wait_resource], [open_transaction_count], [open_resultset_count], [transaction_id], [context_info], [eval_completion_time], [cpu_time], [total_elapsed_time], [Scheduler_time], [task_address], [read], [write], [logic_reads], [text_size], [language], [date_format], [date_first], [quote_identifier], [arithabort], [ansi_null_dflt_ on], [ansi_defaults], [ansi_warnings], [ansi_padding], [ansi_nulls], [concat_null_yields_null], [transaction_isolation_level], [lock_timeout], [deadlock_privacy], [row_count], [pres_errorvel], [nest_errorvel], [nest_errorvel] , [execute_managed_code], [group_id], [query_hash], [query_plan_hash], [most_recent_session_id], [connect_time], [net_transport], [protocol_type], [protocol_version], [endpoint_id], [crypt_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_process_sid] , [client_version], [client_interface_name], [security_id], [login_name], [nt_domain] , [nt_user_name], [memory_usage], [total_schedised_time], [last_request_start_time], [last_request_end_time], [is_user_process], [original_security_id], [original_login_name], [last_successful_logon], [last_logons], xác thực sql_handle], [statement_start_offset], [statement_end_offset], [plan_handle], [database_id], [user_id], [connection_id] từ tbl0 trong đó [status] in ('pause', 'running', 'runnable')), tbl_group as (chọn [blocks_session_id] từ tbl trong đó [blocks_session_id] <> 0 nhóm theo [blocks_session_id]) chọn [session_id], [blocks_session_id], [request_id], [start_time], [status], [command], [phần trăm_complete], [ DBName], [TSQL], [QueryPlan], [wait_type], [login_time], [host_name], [program_name], [wait_time], [last_wait_type], [wait_resource], [open_transa ction_count], [open_resultset_count], [transaction_id], [context_info], [ước tính_completion_time], [cpu_time], [total_elapsed_time], [Scheduler_id], [task_address], [đọc], [ghi], [logic_reads], [text_size] , [ngôn ngữ], [date_format], [date_first], [quote_identifier], [arithabort], [ansi_null_dflt_on], [ansi_defaults], [ansi_warnings], [ansi_padding], [ansi_nulls], [concat_null], [transaction_null], [transaction_null], [transaction_null] lock_timeout], [deadlock_priasty], [row_count], [prev_error], [nest_level], [powers_query_memory], [execute_managed_code], [group_id], [query_hash], [query_plan_hash], [most_recent_session_id], [connect_time] , [protocol_type], [protocol_version], [endpoint_id], [encode_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_idle], [most_recent_handle_sql host_process_id], [client_version], [client_interface_name], [security_id], [login_name], [nt_domain], [nt_user_name], [memory_usage], [total_schedised_time], [last_request_start_time], [last_id_requcess_end_time], [is_user_time] , [original_login_name], [last_successful_logon], [last_unsuccessful_logon], [failed_logons], [authenticating_database_id], [sql_handle], [statement_start_offset], [statement_end_offset], [plan_handle], [database_id] từ t, [user_id_id] chọn tất cả tbl0. [session_id], tbl0. [blocks_session_id], tbl0. [request_id], tbl0. [ start_time], tbl0. [status], tbl0. [command], tbl0. [phần trăm_complete], tbl0. [DBName], tbl0. [TSQL], tbl0. [QueryPlan], tbl0. [wait_type], tbl0. [login_time] , tbl0. [host_name], tbl0. [program_name], tbl0. [wait_time], tbl0. [last_wait_type], tbl0. [wait_resource], tbl0. [open_transaction_count], tbl0. [open_resultset_count], tbl0. [transaction_id], tbl0 .[context_info] ,tbl0.[estimated_completion_time] ,tbl0.[cpu_time] ,tbl0.[total_elapsed_time] ,tbl0.[scheduler_id] ,tbl0.[task_address] ,tbl0.[reads] ,tbl0.[writes] ,tbl0.[ logical_reads] ,tbl0.[text_size] ,tbl0.[language] ,tbl0.[date_format] ,tbl0.[date_first] ,tbl0.[quoted_identifier] ,tbl0.[arithabort] ,tbl0.[ansi_null_dflt_on] ,tbl0.[ansi_defaults] ,tbl0.[ansi_warnings] ,tbl0.[ansi_padding] ,tbl0.[ansi_nulls] ,tbl0.[concat_null_yields_null] ,tbl0.[transaction_isolation_level] ,tbl0.[lock_timeout] ,tbl0.[deadlock_priority] ,tbl0.[row_count] ,tbl0.[prev_error] ,tbl0.[nest_level] ,tbl0.[granted_query_memory] ,tbl0.[executing_managed_code] ,tbl0.[group_id] ,tbl0.[query_hash] ,tbl0.[query_plan_hash] ,tbl0.[most_recent_session_id] ,tbl0.[connect_time] ,tbl0.[net_transport] ,tbl0.[protocol_type] ,tbl0.[protocol_version] ,tbl0.[endpoint_id] ,tbl0.[encrypt_option] ,tbl0.[auth_scheme] ,tbl0.[node_affinity] ,tbl0.[num_reads] ,tbl0.[num_writes] ,tbl0.[last_read] ,tbl0.[last_write] ,tbl0.[net_packet_size] ,tbl0.[client_net_address] ,tbl0.[client_tcp_port] ,tbl0.[local_net_address] ,tbl0.[local_tcp_port] ,tbl0.[parent_connection_id] ,tbl0.[most_recent_sql_handle] ,tbl0.[host_process_id] ,tbl0.[client_version] ,tbl0.[client_interface_name] ,tbl0.[se curity_id] ,tbl0.[login_name] ,tbl0.[nt_domain] ,tbl0.[nt_user_name] ,tbl0.[memory_usage] ,tbl0.[total_scheduled_time] ,tbl0.[last_request_start_time] ,tbl0.[last_request_end_time] ,tbl0.[is_user_process] ,tbl0.[original_security_id] ,tbl0.[original_login_name] ,tbl0.[last_successful_logon] ,tbl0.[last_unsuccessful_logon] ,tbl0.[unsuccessful_logons] ,tbl0.[authenticating_database_id] ,tbl0.[sql_handle] ,tbl0.[statement_start_offset] ,tbl0.[statement_end_offset] ,tbl0.[plan_handle] ,tbl0.[database_id] ,tbl0.[user_id] ,tbl0.[connection_id]from tbl_group as tginner join tbl0 on tg.blocking_session_id=tbl0.session_id;GO

    [/expand]

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

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

[expand title=”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[AutoStatisticsActiveRequests]ASBEGIN SET NOCOUNT ON; THIẾT LẬP MỨC ĐỘ CỰC KỲ GIAO DỊCH ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT; 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; THIẾT LẬP MỨC ĐỘ CỰC KỲ GIAO DỊCH ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT; 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).

Tóm tắt

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. Định cấu hình thư cơ sở dữ liệu trong SQL Server

  2. Có sự khác biệt nào giữa DateTime trong c # và DateTime trong máy chủ SQL không?

  3. 3 lý do hàng đầu mà mọi người chuyển đến SaaS

  4. Làm cách nào để viết CẬP NHẬT SQL với bí danh Bảng trong SQL Server 2008?

  5. Ví dụ về DATENAME () trong SQL Server