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

Cấu hình theo phạm vi cơ sở dữ liệu SQL Server và sửa kế hoạch tự động

Trong bài viết này, chúng tôi sẽ kiểm tra cấu hình theo phạm vi cơ sở dữ liệu và sửa kế hoạch tự động SQL Server 2017. Microsoft đã thêm các tính năng mới vào SQL Server 2017 để cải thiện hiệu suất truy vấn.

Hiệu suất truy vấn SQL Server liên quan đến chất lượng và độ chính xác của kế hoạch thực thi. Khi chúng tôi chạy một truy vấn, trình tối ưu hóa truy vấn sẽ phân tích nhiều kế hoạch thực thi và sau đó quyết định kế hoạch thực thi truy vấn tối ưu.

Ước tính số lượng kế thừa: Công cụ ước tính số lượng dự đoán có bao nhiêu hàng mà truy vấn sẽ trả về, cũng như xác định phân bổ bộ nhớ của truy vấn.

Trong SQL Server 2017, phiên bản mô hình ước tính thẻ số mặc định là 14.0, nhưng nếu bạn muốn sử dụng phiên bản 7.0 cũ hơn của Công cụ ước tính thẻ số, bạn có thể thực hiện việc này bằng cách thay đổi tùy chọn Ước tính thẻ số kế thừa trong Cấu hình phạm vi cơ sở dữ liệu phần.

Giá trị mặc định của Ước tính số lượng kế thừa là TẮT. Vì vậy, nếu bạn muốn sử dụng phiên bản cũ hơn, bạn phải chuyển nó sang BẬT.

Ngoài ra, bạn có thể thay đổi thuộc tính này trong T-SQL.

 AL SAU CƠ SỞ DỮ LIỆU ĐƯỢC PHỤC VỤ CẤU HÌNH ĐƯỢC ĐẶT LEGACY_CARDINALITY_ESTIMATION =TẮT | BẬT; 

Tuy nhiên, nếu bạn bật cài đặt này, nó sẽ ảnh hưởng đến tất cả các truy vấn. Do đó, điều này có thể làm hỏng hiệu suất truy vấn. Để tránh điều này, bạn có thể sử dụng gợi ý FORCE_LEGACY_CARDINALITY_ESTIMATION.

Khi chúng tôi chạy truy vấn này trong cơ sở dữ liệu WideWorldImporters, nó sẽ tự động sử dụng phiên bản mới của ước tính số lượng.

 SELECT [o]. [CustomerID], o.LastEditedBy, [o]. [OrderDate] FROM Sales.Orders oWHERE [o]. [OrderDate]> ='20140101' 

Khi chúng tôi thêm FORCE_LEGACY_CARDINALITY_ESTIMATION vào truy vấn, trình tối ưu hóa truy vấn sẽ sử dụng phiên bản trước đó hoặc phiên bản cũ nhất của ước tính số lượng.

MAXDOP : chúng ta có thể đặt mức độ song song tối đa cho một cơ sở dữ liệu riêng lẻ. Trước khi tính năng này được tạo, chúng tôi chỉ có thể định cấu hình cấp máy chủ MAXDOP.

Gợi ý truy vấn MAXDOP cho phép chúng tôi chạy các truy vấn song song.

 ALTER DATABPED CẤU HÌNH CẤU HÌNH MAXDOP =4; ĐI 

Đánh giá thông số: Khi thời gian thực thi truy vấn thay đổi đáng kể và sự thay đổi thời gian này có liên quan đến tham số truy vấn, thì nó được gọi là đánh giá tham số.

Bây giờ, chúng ta sẽ tạo một thủ tục được lưu trữ trên cơ sở dữ liệu AdventureWorks. Chúng tôi sẽ gửi các thông số khác nhau và so sánh các kế hoạch thực hiện.

 THỦ TỤC DROP NẾU TỒN TẠI THỦ TỤC Get_OrdersGOCREATE Get_Orderes @ ProductID INTASSELECT SalesOrderDetailID, OrderQtyFROM Sales.SalesOrderDetailWHERE ProductID =@ProductID; ĐI / ******* Không sử dụng tập lệnh này trong máy chủ sản xuất! ******* / DBCC FREEPROCCACHE - Truy vấn MarsEXEC Get_OrderID_OrderQty @ ProductID =870DBCC FREEPROCCACHE - Truy vấn VenusEXEC Get_OrderID_OrderQty @ ProductID =897 

Như được hiển thị trong hình ảnh bên dưới, SQL Server tạo một kế hoạch thực thi khác cho cùng một truy vấn. Kế hoạch thực thi Query Mars đề xuất một chỉ mục. Tham số truy vấn thay đổi kế hoạch thực thi tối ưu.

Thực thi truy vấn này và xem xét các kế hoạch thực thi.

 DBCC FREEPROCCACHE - Truy vấn MarsEXEC Get_OrderID_OrderQty @ ProductID =870 - Truy vấn VenusEXEC Get_OrderID_OrderQty @ ProductID =897 

Kế hoạch thực hiện Query Venus cũng giống như kế hoạch thực hiện Query Mars. Đây là tham số đánh hơi vì kế hoạch thực thi được lưu trong bộ nhớ cache được biên dịch cho kế hoạch thực thi Truy vấn Mars. Vì lý do này, Query Venus sử dụng cùng một kế hoạch thực thi.

Bây giờ, chúng tôi sẽ tắt tính năng dò tìm tham số và chạy các truy vấn tương tự.

 ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING =OFF; DBCC FREEPROCCACHE - Truy vấn MarsEXEC Get_OrderID_OrderQty @ ProductID =870 - Truy vấn VenusEXEC Get_OrderID_OrderQty @ ProductID =897 

Hãy kiểm tra:

Trình tối ưu hóa truy vấn SQL Server đã tạo kế hoạch thực thi tối ưu cho Truy vấn Venus và Truy vấn Mars. Cách tiếp cận này mang lại hiệu suất tối ưu cho truy vấn.

Có một số tùy chọn để tránh vấn đề này:

  • TÙY CHỌN (THU HỒI)
  • TÙY CHỌN (TỐI ƯU HÓA CHO (@ VARIABLE =UNKNOWN))

Chỉnh sửa kế hoạch tự động

SQL Server 2017 bao gồm một tính năng mới được gọi là Sửa kế hoạch tự động. Khi chúng tôi thực hiện một truy vấn, trình tối ưu hóa truy vấn sẽ tạo ra một kế hoạch thực thi. Vì một số lý do, trình tối ưu hóa truy vấn chọn sai kế hoạch thực thi. Một số lý do như sau:

  • Truy vấn không đáp ứng tiêu chí hiệu suất
  • Số liệu thống kê lỗi thời
  • Các chỉ mục không phù hợp

Khi trình tối ưu hóa truy vấn SQL Server quyết định thay đổi kế hoạch thực thi và kế hoạch thực thi này làm hỏng hiệu suất, hiệu suất truy vấn được gọi là hồi quy kế hoạch. Một tính năng mới đi kèm với SQL Server 2016. Công cụ này giúp theo dõi và khắc phục sự cố hiệu suất truy vấn, đồng thời lưu trữ số liệu hiệu suất và bộ đếm thực thi truy vấn.

Chúng tôi có thể bật các tùy chọn này trong thuộc tính cơ sở dữ liệu.

Bây giờ, chúng tôi sẽ thực hiện một bản demo của tính năng này. Trước hết, hãy xóa bộ đệm ẩn của thủ tục và tạo một thủ tục được lưu trữ.

 / **************************************** Không sử dụng tập lệnh này trong máy chủ sản xuất ***************************************** / SỬ DỤNG WideWorldImportersALTER CƠ SỞ DỮ LIỆU WideWorldImporters SET QUERY_STORE =BẬT; ALTER DATABASE [WideWorldImporters] SET QUERY_STORE XÓA ALLDBCC FREEPROCCACHE - Lệnh này sẽ xóa tất cả bộ đệm thủ tục trong SQL Server. Không thử trong môi trường sản xuất-- ALTER DATABASE WideWorldImporters SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN =OFF); DROP PROCEDURE IF EXISTS Test_CoddingSight2 GO CREATE PROC Test_CoddingSight2 @Id AS INT AS chọn tổng ([UnitPrice] * [Quantity]) từ Sales.OrderLines O INNER tham gia bán hàng. Đơn đặt hàng o1 ON o1.OrderID =o.OrderID trong đó o.PackageTypeID =@ Id 

Tại bước này, chúng tôi sẽ thực hiện thủ tục này với các tham số khác nhau và tìm sự khác biệt về thời gian thực hiện.

 --Query AlphaDBCC FREEPROCCACHE EXEC Test_CoddingSight2 7GO 80DBCC FREEPROCCACHE EXEC Test_CoddingSight2 -1 - Truy vấn BetaEXEC Test_CoddingSight2 7GO 80 

Như bạn có thể thấy, truy vấn đầu tiên được hoàn thành trong 12 giây, trong khi truy vấn thứ hai được thực hiện trong 33 giây. Lý do cho sự khác biệt đáng kể này là trình tối ưu hóa truy vấn chọn một kế hoạch thực thi không phù hợp cho Query Beta.

Hãy so sánh các kế hoạch thực thi của Query Alpha và Query Beta.

Kế hoạch thực thi của Truy vấn Alpha

Kế hoạch thực thi của Truy vấn Beta

Trong các hình ảnh ở trên, trình tối ưu hóa truy vấn tạo các kế hoạch thực thi khác nhau cho cùng một truy vấn. Khi chúng tôi xem xét Truy vấn tiêu tốn tài nguyên hàng đầu , chúng ta có thể thấy rằng Query Beta tiêu thụ nhiều tài nguyên hơn Query Alpha.

Truy vấn dưới đây sẽ trả về thông tin chi tiết về các đề xuất điều chỉnh.

 CHỌN tên, lý do, điểm số, JSON_VALUE (chi tiết, '$ .implementationDetails.script') làm tập lệnh, chi tiết. * FROM sys.dm_db_tuning_recommendations CHÉO ÁP DỤNG OPENJSON (chi tiết, '$ .planForceDetails') VỚI (query_id int '$ .queryId ', regression_plan_id int' $ .regressedPlanId ', last_good_plan_id int' $ .recommendedPlanId ') dưới dạng chi tiếtWHERE JSON_VALUE (state,' $ .currentValue ') =' Hoạt động '

Cột lý do cho biết lý do tại sao chúng tôi phải áp dụng khuyến nghị này.

Bây giờ, chúng tôi sẽ chạy lại Query Alpha và Query Beta với tính năng tự động sửa kế hoạch được bật.

 / **************************************** Không sử dụng tập lệnh này trong máy chủ sản xuất ***************************************** / ALTER DATABASE [WideWorldImporters] ĐẶT QUERY_STORE XÓA ALLDBCC FREEPROCCACHE / **************************************** Bật sửa kế hoạch tự động ***************************************** / ALTER DATABASE WideWorldImporters SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN =TRÊN); --Query AlphaDBCC FREEPROCCACHE EXEC Test_CoddingSight2 7GO 80DBCC FREEPROCCACHE EXEC Test_CoddingSight2 -1 - Truy vấn BetaEXEC Test_CoddingSight2 7GO 80 

Sau bản demo này, kế hoạch thực thi Query Alpha được áp dụng cho Query Beta. Ngoài ra, thời gian thực thi Query Alpha và Query Beta gần nhau. Truy vấn dưới đây sẽ trả về trạng thái sửa gói tự động.

 CHỌN tên, lý do, điểm số, JSON_VALUE (trạng thái, '$ .currentValue') làm trạng thái, JSON_VALUE (chi tiết, '$ .implementationDetails.script') làm tập lệnh, chi tiết. * FROM sys.dm_db_tuning_recommendations CROSS ÁP DỤNG OPENJSON (chi tiết , '$ .planForceDetails') VỚI (query_id int '$ .queryId', regression_plan_id int '$ .regressedPlanId', last_good_plan_id int '$ .recommendedPlanId') làm chi tiếtWHERE JSON_VALUE (trạng thái, '$ .currentValfying') / pre> 

Ngoài ra, chúng tôi có thể tìm thấy một số thông tin đồ họa trong Truy vấn có kế hoạch cưỡng bức . Biểu đồ này xác định các kế hoạch truy vấn bắt buộc và truy vấn.

Tài liệu tham khảo

Sửa kế hoạch tự động trong SQL Server 2017

Ước tính Cardinality


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gửi email có tệp đính kèm trong SQL Server (T-SQL)

  2. chọn * từ bảng so với chọn colA, colB, v.v. từ hành vi thú vị của bảng trong SQL Server 2005

  3. Tại sao lại xảy ra lỗi liên quan đến mạng hoặc lỗi cụ thể đối với phiên bản cụ thể trong khi thiết lập kết nối với SQL Server?

  4. Không thể kết nối với localhost, nhưng có thể với tên máy tính trong SQL Server 2008

  5. Làm cách nào tôi có thể sử dụng một nhóm kết nối mssql duy nhất trên nhiều tuyến đường trong ứng dụng web Express 4?