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

Làm cách nào để tôi có được một Kế hoạch Thực thi Truy vấn trong SQL Server?

Có một số phương pháp để có được một kế hoạch thực hiện, phương pháp nào sử dụng sẽ tùy thuộc vào hoàn cảnh của bạn. Thông thường, bạn có thể sử dụng SQL Server Management Studio để lấy một kế hoạch, tuy nhiên nếu vì lý do nào đó bạn không thể chạy truy vấn của mình trong SQL Server Management Studio thì bạn có thể thấy hữu ích khi có được kế hoạch thông qua SQL Server Profiler hoặc bằng cách kiểm tra bộ nhớ cache của kế hoạch.

Phương pháp 1 - Sử dụng SQL Server Management Studio

SQL Server đi kèm với một số tính năng gọn gàng giúp bạn dễ dàng nắm bắt kế hoạch thực thi, chỉ cần đảm bảo rằng mục menu "Bao gồm kế hoạch thực thi thực tế" (được tìm thấy trong menu "Truy vấn") được đánh dấu và chạy truy vấn của bạn như bình thường .

Nếu bạn đang cố gắng lấy kế hoạch thực thi cho các câu lệnh trong một thủ tục được lưu trữ thì bạn nên thực thi thủ tục được lưu trữ, như sau:

exec p_Example 42

Khi truy vấn của bạn hoàn thành, bạn sẽ thấy một tab bổ sung có tên "Kế hoạch thực thi" xuất hiện trong ngăn kết quả. Nếu bạn chạy nhiều câu lệnh thì bạn có thể thấy nhiều kế hoạch được hiển thị trong tab này.

Từ đây, bạn có thể kiểm tra kế hoạch thực thi trong SQL Server Management Studio hoặc nhấp chuột phải vào kế hoạch và chọn "Lưu kế hoạch thực thi dưới dạng ..." để lưu kế hoạch vào một tệp ở định dạng XML.

Phương pháp 2 - Sử dụng tùy chọn SHOWPLAN

Phương pháp này rất giống với phương pháp 1 (trên thực tế đây là những gì SQL Server Management Studio thực hiện trong nội bộ), tuy nhiên tôi đã đưa nó vào để hoàn thiện hoặc nếu bạn không có sẵn SQL Server Management Studio.

Trước khi bạn chạy truy vấn của mình, hãy chạy một trong số các câu sau. Câu lệnh phải là câu lệnh duy nhất trong lô, tức là bạn không thể thực hiện một câu lệnh khác cùng lúc:

SET SHOWPLAN_TEXT ON
SET SHOWPLAN_ALL ON
SET SHOWPLAN_XML ON
SET STATISTICS PROFILE ON
SET STATISTICS XML ON -- The is the recommended option to use

Đây là các tùy chọn kết nối và vì vậy bạn chỉ cần chạy nó một lần cho mỗi kết nối. Từ thời điểm này trở đi, tất cả các câu lệnh được chạy sẽ được hỗ trợ bởi một tập kết quả bổ sung chứa kế hoạch thực thi của bạn ở định dạng mong muốn - chỉ cần chạy truy vấn của bạn như bình thường để xem kế hoạch.

Sau khi hoàn tất, bạn có thể tắt tùy chọn này bằng câu lệnh sau:

SET <<option>> OFF

So sánh các định dạng kế hoạch thực thi

Trừ khi bạn có sở thích cao, khuyến nghị của tôi là sử dụng STATISTICS XML lựa chọn. Tùy chọn này tương đương với tùy chọn "Bao gồm Kế hoạch Thực thi Thực tế" trong SQL Server Management Studio và cung cấp nhiều thông tin nhất ở định dạng thuận tiện nhất.

  • SHOWPLAN_TEXT - Hiển thị kế hoạch thực thi ước tính dựa trên văn bản cơ bản mà không cần thực hiện truy vấn
  • SHOWPLAN_ALL - Hiển thị kế hoạch thực hiện ước tính dựa trên văn bản với ước tính chi phí mà không cần thực hiện truy vấn
  • SHOWPLAN_XML - Hiển thị kế hoạch thực thi ước tính dựa trên XML với các ước tính chi phí mà không cần thực hiện truy vấn. Điều này tương đương với tùy chọn "Hiển thị kế hoạch thực thi ước tính ..." trong SQL Server Management Studio.
  • STATISTICS PROFILE - Thực hiện truy vấn và hiển thị kế hoạch thực thi thực tế dựa trên văn bản.
  • STATISTICS XML - Thực thi truy vấn và hiển thị kế hoạch thực thi thực tế dựa trên XML. Điều này tương đương với tùy chọn "Bao gồm kế hoạch thực thi thực tế" trong SQL Server Management Studio.

Phương pháp 3 - Sử dụng SQL Server Profiler

Nếu bạn không thể chạy trực tiếp truy vấn của mình (hoặc truy vấn của bạn không chạy chậm khi bạn thực thi trực tiếp - hãy nhớ rằng chúng tôi muốn một kế hoạch của truy vấn hoạt động kém), thì bạn có thể nắm bắt một kế hoạch bằng cách sử dụng theo dõi SQL Server Profiler. Ý tưởng là chạy truy vấn của bạn trong khi một dấu vết ghi lại một trong các sự kiện "Showplan" đang chạy.

Lưu ý rằng tùy thuộc vào tải mà bạn có thể sử dụng phương pháp này trên môi trường sản xuất, tuy nhiên bạn nên thận trọng. Cơ chế cấu hình SQL Server được thiết kế để giảm thiểu tác động đến cơ sở dữ liệu nhưng điều này không có nghĩa là sẽ không có bất kỳ tác động đến hiệu suất. Bạn cũng có thể gặp sự cố khi lọc và xác định kế hoạch chính xác trong dấu vết của mình nếu cơ sở dữ liệu của bạn đang được sử dụng nhiều. Rõ ràng bạn nên kiểm tra với DBA của mình để xem liệu họ có hài lòng với việc bạn làm điều này trên cơ sở dữ liệu quý giá của họ hay không!

  1. Mở SQL Server Profiler và tạo một dấu vết mới kết nối với cơ sở dữ liệu mong muốn mà bạn muốn ghi lại dấu vết.
  2. Trong tab "Lựa chọn sự kiện", chọn "Hiển thị tất cả sự kiện", chọn hàng "Hiệu suất" -> "Trình chiếu XML" và chạy theo dõi.
  3. Trong khi theo dõi đang chạy, hãy làm bất cứ điều gì bạn cần làm để truy vấn đang chạy chậm.
  4. Chờ truy vấn hoàn tất và dừng theo dõi.
  5. Để lưu dấu vết, hãy nhấp chuột phải vào kế hoạch xml trong SQL Server Profiler và chọn "Trích xuất dữ liệu sự kiện ..." để lưu kế hoạch vào tệp ở định dạng XML.

Gói bạn nhận được tương đương với tùy chọn "Bao gồm kế hoạch thực thi thực tế" trong SQL Server Management Studio.

Phương pháp 4 - Kiểm tra bộ đệm truy vấn

Nếu bạn không thể chạy trực tiếp truy vấn của mình và bạn cũng không thể ghi lại dấu vết của bộ hồ sơ thì bạn vẫn có thể có được kế hoạch ước tính bằng cách kiểm tra bộ đệm ẩn kế hoạch truy vấn SQL.

Chúng tôi kiểm tra bộ đệm ẩn của kế hoạch bằng cách truy vấn các DMV của SQL Server. Sau đây là một truy vấn cơ bản sẽ liệt kê tất cả các kế hoạch truy vấn được lưu trong bộ nhớ cache (dưới dạng xml) cùng với văn bản SQL của chúng. Trên hầu hết các cơ sở dữ liệu, bạn cũng sẽ cần thêm các mệnh đề lọc bổ sung để lọc kết quả xuống chỉ các kế hoạch bạn quan tâm.

SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)

Thực hiện truy vấn này và nhấp vào XML kế hoạch để mở kế hoạch trong một cửa sổ mới - nhấp chuột phải và chọn "Lưu kế hoạch thực hiện dưới dạng ..." để lưu kế hoạch vào tệp ở định dạng XML.

Ghi chú:

Vì có rất nhiều yếu tố liên quan (từ giản đồ bảng và chỉ mục đến dữ liệu được lưu trữ và thống kê bảng) nên bạn luôn luôn cố gắng lấy một kế hoạch thực thi từ cơ sở dữ liệu mà bạn quan tâm (thường là kế hoạch đang gặp sự cố về hiệu suất).

Bạn không thể nắm bắt kế hoạch thực thi cho các thủ tục được lưu trữ được mã hóa.

Kế hoạch thực hiện

"thực tế" so với "ước tính"

An thực tế kế hoạch thực thi là một kế hoạch mà SQL Server thực sự chạy truy vấn, trong khi một ước tính kế hoạch thực thi SQL Server giải quyết những gì nó sẽ làm mà không thực hiện truy vấn. Mặc dù tương đương về mặt logic, một kế hoạch thực thi thực tế hữu ích hơn nhiều vì nó chứa các thông tin chi tiết và thống kê bổ sung về những gì đã thực sự xảy ra khi thực hiện truy vấn. Điều này là cần thiết khi chẩn đoán các vấn đề trong đó các ước tính Máy chủ SQL bị tắt (chẳng hạn như khi số liệu thống kê đã lỗi thời).

  • Đã xem lại kế hoạch thực hiện ước tính và thực tế

Làm cách nào để diễn giải kế hoạch thực thi truy vấn?

Đây là một chủ đề đủ xứng đáng cho một cuốn sách (miễn phí) theo đúng nghĩa của nó.

Xem thêm:

  • Kiến thức cơ bản về kế hoạch thực hiện
  • Quyền SHOWPLAN và Lô giao dịch-SQL
  • SQL Server 2008 - Sử dụng hàm băm truy vấn và hàm băm kế hoạch truy vấn
  • Phân tích bộ nhớ cache của kế hoạch máy chủ SQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có thể để mệnh đề Đầu ra SQL trả về một cột không được chèn vào không?

  2. Đang đợi localhost, mãi mãi!

  3. Làm cách nào để so sánh 2 hàng từ cùng một bảng (SQL Server)?

  4. Sự khác biệt giữa các phép chuyển đổi Kết hợp Tham gia và Tra cứu trong SSIS là gì?

  5. Cách xác định khóa chính tự động tăng dần trong SQL Server