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

So sánh các kế hoạch thực thi trong SQL Server

Quản trị viên Cơ sở dữ liệu luôn cố gắng điều chỉnh hiệu suất truy vấn SQL Server. Bước đầu tiên trong việc điều chỉnh hiệu suất truy vấn là phân tích kế hoạch thực thi của một truy vấn. Theo một số điều kiện, SQL Server Query Optimizer có thể tạo các kế hoạch thực thi khác nhau. Tại thời điểm này, tôi muốn thêm một số lưu ý về SQL Server Query Optimizer. SQL Server Query Optimizer là một trình tối ưu hóa dựa trên chi phí phân tích các kế hoạch thực thi và quyết định kế hoạch thực thi tối ưu cho một truy vấn. Từ khóa quan trọng cho SQL Server Query Optimizer là một kế hoạch thực thi tối ưu không nhất thiết phải là kế hoạch thực thi tốt nhất. Đó là lý do tại sao, nếu SQL Server Query Optimizer cố gắng tìm ra kế hoạch thực thi tốt nhất cho mọi truy vấn, thì sẽ mất thêm thời gian và điều đó gây ra thiệt hại cho hiệu suất của SQL Server Engine. Trong SQL Server 2016, Microsoft đã thêm một khả năng mới vào SQL Server Management Studio, được gọi là Compare Showplan. Tính năng này cho phép chúng tôi so sánh hai kế hoạch thực thi khác nhau. Đồng thời, chúng tôi có thể sử dụng tùy chọn này ngoại tuyến, có nghĩa là chúng tôi không cần kết nối phiên bản SQL Server. Hãy tưởng tượng rằng bạn viết một truy vấn và truy vấn này hoạt động tốt trong môi trường TEST nhưng trong PROD (môi trường sản xuất), nó hoạt động rất kém. Để xử lý vấn đề này, chúng ta cần so sánh các kế hoạch thực thi. Trước khi có tính năng này, chúng tôi đã từng mở hai SQL Server Management Studios và đặt các kế hoạch thực thi cạnh nhau nhưng phương pháp này rất bất tiện.

Làm cách nào để so sánh hai kế hoạch thực thi?

Trong phần trình diễn này, chúng tôi sẽ sử dụng cơ sở dữ liệu AdventureWorks và so sánh hai kế hoạch thực thi có Phiên bản mô hình ước tính số lượng khác nhau và phát hiện sự khác biệt này bằng So sánh Showplan.

Đầu tiên, chúng tôi sẽ mở một cửa sổ truy vấn mới trong SQL Server Management Studio và nhấp vào Bao gồm kế hoạch thực thi thực tế và sau đó thực hiện truy vấn sau.

SELECT 
        soh.[SalesPersonID]
        ,p.[FirstName] + ' ' + COALESCE(p.[MiddleName], '') + ' ' + p.[LastName] AS [FullName]
        ,e.[JobTitle]
        ,st.[Name] AS [SalesTerritory]
        ,soh.[SubTotal]
        ,YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear] 
    FROM [Sales].[SalesPerson] sp 
        INNER JOIN [Sales].[SalesOrderHeader] soh 
        ON sp.[BusinessEntityID] = soh.[SalesPersonID]
        INNER JOIN [Sales].[SalesTerritory] st 
        ON sp.[TerritoryID] = st.[TerritoryID] 
        INNER JOIN [HumanResources].[Employee] e 
        ON soh.[SalesPersonID] = e.[BusinessEntityID] 
		INNER JOIN [Person].[Person] p
		ON p.[BusinessEntityID] = sp.[BusinessEntityID]

Trong bước này, chúng tôi sẽ lưu kế hoạch thực hiện đầu tiên của mình. Nhấp chuột phải vào bất kỳ vị trí nào trong kế hoạch thực thi và nhấp vào Lưu kế hoạch thực thi dưới dạng và lưu kế hoạch thực thi dưới dạng ExecutionPlan_CE140.sqlplan.

Bây giờ chúng ta sẽ mở một tab truy vấn mới trong SQL Server Management Studio và thực hiện truy vấn bên dưới. Trong truy vấn này, chúng tôi sẽ thêm gợi ý truy vấn FORCE_LEGACY_CARDINATIONAL_ESTIMATION vào cuối truy vấn buộc phải sử dụng Phiên bản mô hình ước tính số lượng cũ hơn.
Nhiệm vụ của Ước tính bản số là dự đoán có bao nhiêu hàng mà truy vấn của chúng tôi sẽ trả về.

SELECT 
        soh.[SalesPersonID]
        ,p.[FirstName] + ' ' + COALESCE(p.[MiddleName], '') + ' ' + p.[LastName] AS [FullName]
        ,e.[JobTitle]
        ,st.[Name] AS [SalesTerritory]
        ,soh.[SubTotal]
        ,YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear] 
    FROM [Sales].[SalesPerson] sp 
        INNER JOIN [Sales].[SalesOrderHeader] soh 
        ON sp.[BusinessEntityID] = soh.[SalesPersonID]
        INNER JOIN [Sales].[SalesTerritory] st 
        ON sp.[TerritoryID] = st.[TerritoryID] 
        INNER JOIN [HumanResources].[Employee] e 
        ON soh.[SalesPersonID] = e.[BusinessEntityID] 
INNER JOIN [Person].[Person] p
	ON p.[BusinessEntityID] = sp.[BusinessEntityID]
	OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'));

Chúng tôi sẽ nhấp vào So sánh kế hoạch trình chiếu và chọn kế hoạch thực thi trước đó đã được lưu dưới dạng ExecutionPlan_CE140.sqlplan.

Hình ảnh sau minh họa màn hình đầu tiên của kế hoạch so sánh thực thi SQL Server và các khu vực được đánh dấu màu hồng xác định các hoạt động tương tự.

Nếu chúng tôi nhấp vào bất kỳ toán tử nào trong màn hình kế hoạch thực thi bên dưới hoặc bên trên, SQL Server Management Studio sẽ đánh dấu các toán tử tương tự khác. Ở phía bên phải của bảng điều khiển, bạn có thể tìm thấy các thuộc tính và chi tiết so sánh của các thuộc tính.

Trong bước này, chúng tôi sẽ thay đổi các tùy chọn Phân tích ShowPlan và sẽ đánh dấu toán tử không khớp. Ở cuối màn hình, chúng ta có thể thấy Phân tích kế hoạch bảng điều khiển. Nếu chúng ta xóa Đánh dấu các thao tác tương tự và chọn Đánh dấu các toán tử không khớp với các phân đoạn tương tự, SQL Server Management Studio nêu bật nhà điều hành chưa từng có. Sau đó, nhấp vào Chọn toán tử trong kế hoạch thực hiện bên dưới và bên trên trong bảng điều khiển. SQL Server Management Studio so sánh các thuộc tính của các toán tử đã chọn và đặt các dấu hiệu bất bình đẳng cho các giá trị không giống nhau.

Nếu chúng tôi phân tích màn hình này chi tiết hơn, điều đầu tiên là Phiên bản mô hình ước tính số lượng chính Sự khác biệt. Phiên bản truy vấn đầu tiên là 70 và phiên bản thứ hai là 140. Sự khác biệt này ảnh hưởng đến Số lượng hàng ước tính . Lý do chính gây ra Số lượng hàng ước tính khác nhau là một phiên bản khác của Ước tính số lượng thẻ. Do đó, phiên bản Ước tính tổng số ảnh hưởng trực tiếp đến các chỉ số ước tính của truy vấn. Đối với so sánh truy vấn này, chúng tôi có thể kết luận rằng truy vấn mà phiên bản Ước tính số lượng mã là 140 hoạt động tốt hơn vì số hàng ước tính gần với Số hàng thực tế . Trường hợp này có thể được làm rõ từ bảng dưới đây.

[id bảng =50 /]

Nếu chúng tôi muốn xem các kế hoạch thực hiện cạnh nhau trên cùng một màn hình, chúng tôi có thể nhấp vào Chuyển đổi hướng bộ chia .

Bây giờ chúng ta sẽ thực hiện một cuộc biểu tình khác. Chúng tôi sẽ xem xét truy vấn dưới đây và so sánh các kế hoạch thực thi trước và sau khi tạo chỉ mục.
Khi chúng tôi xem xét kế hoạch thực thi truy vấn dưới đây, chúng tôi khuyên bạn nên tạo chỉ mục không phân cụm.

SELECT [CarrierTrackingNumber] 
FROM [Sales].[SalesOrderDetail] WHERE [SalesOrderDetailID]=12

Chúng tôi sẽ áp dụng chỉ mục được đề xuất và thực hiện lại cùng một truy vấn.

CREATE NONCLUSTERED INDEX Index_NC
ON [Sales].[SalesOrderDetail] ([SalesOrderDetailID])
GO
SELECT [CarrierTrackingNumber] 
FROM [Sales].[SalesOrderDetail] WHERE [SalesOrderDetailID]=12

Trong bước cuối cùng này, chúng tôi sẽ so sánh các kế hoạch thực hiện.

Trong hình ảnh trên, chúng ta có thể có được một số thông tin về các kế hoạch thực hiện. Nhưng sự khác biệt chính là Hoạt động logic đồng ruộng. Một trong số đó là Tìm kiếm chỉ mục và một cái khác là Quét chỉ mục và sự khác biệt về hoạt động này dẫn đến các giá trị số liệu ước tính và thực tế không giống nhau. Cuối cùng, toán tử Tìm kiếm chỉ mục hoạt động tốt hơn toán tử Quét chỉ mục.

Kết luận

Như chúng tôi đã đề cập trong bài viết, tính năng So sánh Showplan cung cấp một số lợi ích cho Nhà phát triển hoặc Quản trị viên Cơ sở dữ liệu. Một số trong số này có thể được tính là:

  • Đơn giản để so sánh sự khác biệt của hai kế hoạch thực hiện.
  • Đơn giản để phát hiện các vấn đề về hiệu suất truy vấn trong các Phiên bản SQL Server khác nhau.
  • Đơn giản để phát hiện các vấn đề về hiệu suất truy vấn trong các môi trường khác nhau.
  • Chỉ cần làm rõ các thay đổi kế hoạch thực thi trước và sau khi tạo chỉ mục.

Tài liệu tham khảo

  • Ước tính Cardinality (SQL Server)
  • Hướng dẫn về kiến ​​trúc xử lý truy vấn

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server (localdb) \ v11.0 giải thích

  2. Hiệu suất SQL Server IN so với EXISTS

  3. SQL chọn tất cả nếu tham số là null nếu không trả về mục cụ thể

  4. Bạn nên chọn kiểu dữ liệu MONEY hay DECIMAL (x, y) trong SQL Server?

  5. lỗi 'datetime2' khi sử dụng khung thực thể trong VS 2010 .net 4.0