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

Chờ thống kê và kho truy vấn

Có rất nhiều bài đăng trên blog này liên quan đến thống kê chờ đợi; chúng là một trong những số liệu quan trọng nhất mà bạn có thể sử dụng khi khắc phục sự cố hiệu suất trong SQL Server. Thống kê chờ đã được tạo sẵn trong SQL Server 2005 và theo truyền thống, chúng biểu thị các lần chờ ở cấp phiên bản thông qua sys.dm_os_wait_stosystem. Thông tin này rất tốt khi khắc phục sự cố hiệu suất hệ thống nói chung, nhưng khi xem xét hiệu suất truy vấn, chỉ có thể thấy thông tin chờ khi truy vấn đang thực thi và nếu nó đang đợi trên một tài nguyên thông qua sys.dm_os_waiting_tasks. Dữ liệu trong sys.dm_os_waiting_tasks là dữ liệu tạm thời (đó là những gì đang chờ đợi ngay bây giờ) và không dễ dàng để nắm bắt và lưu giữ cho vòng đời của truy vấn để điều chỉnh hiệu suất sau này.

Trong SQL Server 2016, một DMV mới được đưa ra, sys.dm_exec_session_wait_stats, cung cấp thông tin về các lần chờ cho một phiên hoạt động hiện có. Nếu bạn biết session_id, bạn có thể theo dõi thời gian chờ truy vấn khi nó bắt đầu và khi nó hoàn thành (chụp nhanh thông tin ở phần đầu và phần cuối của truy vấn, sau đó thay đổi thông tin). Thách thức là bạn phải biết session_id cho truy vấn và bạn phải thiết lập thu thập dữ liệu trước - điều này không hề nhỏ khi bạn đang ở giữa một vấn đề có mức độ ưu tiên cao.

Thông tin thống kê chờ tồn tại trong một kế hoạch thực thi thực tế bắt đầu trong SQL Server 2016 SP1. Chỉ 10 lượt chờ hàng đầu mới được ghi lại và có những hạn chế về những gì mà dữ liệu này thể hiện. Ví dụ:CXPACKET bị bỏ qua và không được bao gồm trong đầu ra, nhưng nó sẽ được bao gồm trong 2016 SP2 và 2017 CU3 trở lên - trong đó các chờ đợi song song không liên quan được CXCONSUMER ghi lại (sẽ không được đưa vào các đợi kế hoạch thực tế).

Vì vậy, làm thế nào chúng ta có thể biết một truy vấn cụ thể đang thực sự chờ đợi điều gì? Chúng ta có thể sử dụng Query Store! SQL Server 2017 bao gồm việc thu thập thông tin thống kê chờ trong Cửa hàng truy vấn và chức năng này cũng có sẵn trong Cơ sở dữ liệu Azure SQL. Số liệu thống kê về thời gian chờ được gắn với một kế hoạch truy vấn và được ghi lại theo thời gian, giống như thống kê thời gian chạy. Việc bổ sung thông tin thống kê chờ trong Cửa hàng truy vấn là yêu cầu tính năng số một sau bản phát hành đầu tiên và tất cả thông tin đó cùng nhau tạo ra khả năng khắc phục sự cố mạnh mẽ.

Bắt đầu

Theo mặc định, tính năng chụp thống kê chờ trong Cửa hàng truy vấn được bật theo mặc định cho Cơ sở dữ liệu Azure SQL. Khi cơ sở dữ liệu mới được tạo trong SQL Server 2017 hoặc cơ sở dữ liệu được nâng cấp từ SQL Server 2014 trở về trước, Cửa hàng truy vấn bị tắt theo mặc định… và do đó, việc thu thập thống kê chờ bị tắt. Khi cơ sở dữ liệu được nâng cấp từ SQL Server 2016, nếu cơ sở dữ liệu đó đã bật Cửa hàng truy vấn, thì quá trình thu thập thống kê chờ cho Cửa hàng truy vấn sẽ được bật khi nâng cấp.

Vì mục đích trình diễn, tôi đã khôi phục cơ sở dữ liệu WideWorldImporters, sau đó tôi thực hiện các truy vấn bên dưới để bật Cửa hàng truy vấn và xóa mọi dữ liệu có thể đã tồn tại trước đó (chỉ cần thiết vì đây là cơ sở dữ liệu mẫu):

ALTER DATABASE [WideWorldImporters] SET QUERY_STORE = ON;
GO
 
ALTER DATABASE [WideWorldImporters] SET QUERY_STORE 
(
  OPERATION_MODE = READ_WRITE
);
GO
 
ALTER DATABASE [WideWorldImporters] SET QUERY_STORE CLEAR;
GO

Cài đặt mặc định được sử dụng với các câu lệnh ở trên và nếu bạn muốn thay đổi bất kỳ tùy chọn nào, bạn có thể thực hiện việc này thông qua giao diện người dùng hoặc thông qua câu lệnh ALTER DATABASE. Bây giờ, Cửa hàng truy vấn đã được bật, nó sẽ bắt đầu thu thập dữ liệu truy vấn bao gồm văn bản truy vấn, (các) kế hoạch, thống kê thời gian chạy và thống kê chờ.

Xem thống kê chờ

Để tạo một số dữ liệu, chúng tôi sẽ tạo một thủ tục được lưu trữ chạy một truy vấn song song lặp đi lặp lại.

DROP PROCEDURE IF EXISTS [Sales].[OrderInfo];
GO
 
CREATE PROCEDURE [Sales].[OrderInfo]
AS
BEGIN
  WHILE 1=1
  BEGIN
    SELECT *
      FROM Sales.OrderLines ol
      INNER JOIN Warehouse.StockItems s
      ON ol.StockItemID = s.StockItemID
      OPTION (QUERYTRACEON 8649);
  END
END

Sau đó, tạo tệp .cmd với mã sau:

start sqlcmd -S WIN2016 \ SQL2017 -d WideWorldImporters -q "EXECUTE [Sales]. [OrderInfo];"
thoát

Điều này cho phép chúng tôi không chạy SP bên trong Management Studio, tạo ra các đợi ASYNC_NETWORK_IO quan trọng; chúng tôi muốn xem các đợi liên quan đến song song. Lưu tệp .cmd, sau đó nhấp đúp để chạy. Bạn có thể tạo thêm tải bằng cách chạy nhiều tệp. Với tình huống này, chúng ta chủ yếu sẽ thấy các đợi liên quan đến truy vấn này, vì chúng ta không có khối lượng công việc nào khác. Vui lòng thực hiện đồng thời các truy vấn khác đối với cơ sở dữ liệu WideWorldImporters nếu bạn muốn tạo nhiều dữ liệu chờ hơn nữa.

Sau vài phút, dừng các tệp lệnh và mở rộng cơ sở dữ liệu WideWorldImporters trong Management Studio để xem thư mục Cửa hàng truy vấn và các báo cáo bên dưới. Nếu bạn mở báo cáo Truy vấn tiêu thụ tài nguyên hàng đầu, bạn sẽ thấy truy vấn thủ tục được lưu trữ là truy vấn hàng đầu.

Chế độ xem mặc định cho báo cáo này hiển thị các truy vấn có tổng thời lượng cao nhất. Để xem các truy vấn dựa trên thống kê chờ, chúng ta có thể chọn nút Định cấu hình và thay đổi thành Thời gian chờ (mili giây).

Nút định cấu hình trong chế độ xem báo cáo (trên cùng bên phải) Thay đổi tài nguyên cho báo cáo Lưu ý rằng bạn cũng có thể định cấu hình khoảng thời gian và số lượng truy vấn được trả về. Đối với ví dụ này, giờ cuối cùng có thể chấp nhận được.

Nếu bạn di chuột qua thanh cho truy vấn đầu tiên, bạn có thể thấy thời gian chờ truy vấn. Chế độ xem này hiện là cách duy nhất để xem thông tin chờ trong giao diện người dùng, nhưng các báo cáo bổ sung dành riêng cho số liệu thống kê về thời gian chờ hy vọng sẽ có trong bản phát hành trong tương lai của Management Studio.

Chờ thông tin trong giao diện người dùng

Những người trong số bạn đã làm việc với số liệu thống kê chờ đợi sẽ nhận thấy rằng các mô tả kiểu chờ khác nhau. Nghĩa là, thay vì kiểu chờ CXPACKET để biểu thị tính song song, bạn chỉ cần thấy “Kiểu chờ song song”. Đây là điểm khác biệt cơ bản trong Cửa hàng truy vấn:Các kiểu chờ đợi được nhóm thành các danh mục. Có hơn 900 kiểu chờ khác nhau trong SQL Server tại thời điểm này và việc cố gắng theo dõi từng kiểu riêng biệt là cực kỳ tốn kém. Ngoài ra, Cửa hàng truy vấn được thiết kế dành cho tất cả các chuyên gia dữ liệu - cho dù bạn là chuyên gia điều chỉnh hiệu suất hay chỉ mới bắt đầu hiểu cách SQL Server hoạt động, bạn sẽ có thể sử dụng Cửa hàng truy vấn để dễ dàng tìm thấy các truy vấn hoạt động kém. Điều đó cũng có nghĩa là làm cho thông tin chờ đợi dễ hiểu hơn. Để có danh sách đầy đủ các danh mục chờ đợi và các loại chờ đợi bên trong, vui lòng truy cập tài liệu cho sys.query_store_wait_stats.

Bạn cũng có thể xem thông tin chờ bằng T-SQL. Một truy vấn mẫu là truy vấn bên dưới, bao gồm truy vấn, (các) plan_id cho truy vấn đó và chờ thống kê trong một khoảng thời gian nhất định:

SELECT TOP (10)
  [ws].[wait_category_desc],
  [ws].[avg_query_wait_time_ms],
  [ws].[total_query_wait_time_ms],
  [ws].[plan_id],
  [qt].[query_sql_text],
  [rsi].[start_time],
  [rsi].[end_time]
FROM [sys].[query_store_query_text] [qt]
JOIN [sys].[query_store_query] [q]
    ON [qt].[query_text_id] = [q].[query_text_id]
JOIN [sys].[query_store_plan] [qp] 
    ON [q].[query_id] = [qp].[query_id]
JOIN [sys].[query_store_runtime_stats] [rs] 
    ON [qp].[plan_id] = [rs].[plan_id]
JOIN [sys].[query_store_runtime_stats_interval] [rsi] 
    ON [rs].[runtime_stats_interval_id] = [rsi].[runtime_stats_interval_id]
JOIN [sys].[query_store_wait_stats] [ws]
    ON [ws].[runtime_stats_interval_id] = [rs].[runtime_stats_interval_id]
    AND [ws].[plan_id] = [qp].[plan_id]
WHERE [rsi].[end_time] > DATEADD(MINUTE, -5, GETUTCDATE()) 
AND [ws].[execution_type] = 0
ORDER BY [ws].[avg_query_wait_time_ms] DESC;

Kết quả truy vấn

Mặc dù bây giờ bạn có thể thấy tất cả các lần chờ đợi cho một truy vấn nhất định và kế hoạch của nó, bạn vẫn sẽ phải tìm hiểu sâu hơn về hiệu suất để hiểu, ví dụ:tại sao một truy vấn lại chạy song song (khi có lẽ bạn không muốn) hoặc những gì có thể đang chặn một truy vấn. Lưu ý rằng thống kê chờ, giống như thống kê thời gian chạy, được gắn với kế hoạch truy vấn theo thời gian. Trong đầu ra này, độ dài khoảng thời gian cho Cửa hàng truy vấn được đặt là 10 phút, do đó, thống kê thời gian chờ dành cho từng gói trong khoảng thời gian 10 phút đó (11:50 chiều ngày 21 tháng 11 năm 2017 đến nửa đêm ngày 22 tháng 11 năm 2017). Theo mặc định, khoảng thời gian khi bạn bật Cửa hàng truy vấn là 60 phút.

Tóm tắt

Thống kê chờ, kết hợp với các kế hoạch truy vấn riêng lẻ, làm cho Cửa hàng truy vấn trở thành một công cụ thậm chí còn đáng gờm hơn khi khắc phục sự cố hệ thống và hiệu suất truy vấn. Cửa hàng truy vấn là tính năng duy nhất cho phép bạn nắm bắt nguyên bản truy vấn, kế hoạch, số liệu hiệu suất và thống kê chờ tất cả ở một vị trí. Đối với những người bạn đã từng sử dụng vô số kiểu chờ đợi, việc điều chỉnh các danh mục được sử dụng trong Cửa hàng truy vấn phải liền mạch. Đối với bất kỳ ai mới để chờ thống kê, các danh mục là một nơi tuyệt vời để bắt đầu hiểu tài nguyên mà truy vấn đang chờ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Một cải tiến tiềm năng cho các bản cập nhật thống kê:MAXDOP

  2. ScaleGrid hiện đã có ở Khu vực AWS Sydney

  3. Kết nối AnySQL Maestro với Salesforce.com

  4. Lỗi ORA-65048 khi thay đổi mật khẩu người dùng trong cơ sở dữ liệu vùng chứa (CDB)

  5. Cách lập mô hình để bảo trì cơ sở dữ liệu dễ dàng