SQL Server thay đổi kế hoạch thực hiện - Phần 2


7

Câu hỏi trước: SQL Server thay đổi kế hoạch thực hiện

Chúng tôi đang sử dụng SQL Server 2014 Developer Edition.

SQL Server thay đổi kế hoạch thực hiện trên cùng một truy vấn và cùng một cơ sở dữ liệu và SQL Server (tôi đã kiểm tra nhiều lần).

Nếu tôi kết nối với Management Studio từ máy tính dev của mình bằng tài khoản AD, sẽ mất 18 giây để hoàn thành truy vấn (hầu hết thời gian). Nếu tôi đi với kết nối từ xa đến máy chủ và thực hiện truy vấn trong Management Studio, sẽ mất 2 giây để hoàn tất. Trên máy của đồng nghiệp tôi mất 2 giây với Management Studio và 18 nếu anh ta kết nối với ứng dụng MVC (Ado.Net).

Những việc chúng tôi đã làm

  • Khởi động lại máy chủ SQL
  • DBCC FREEPROCCACHE
  • sp_updatestats
  • thử với những người dùng khác nhau Người dùng AD và SQL

Kế hoạch thực hiện chậm

Kế hoạch thực hiện chậm

Kế hoạch thực hiện nhanh

Kế hoạch thực hiện nhanh

Truy vấn

SET ANSI_NULLS ON
GO

SET ANSI_PADDING ON
GO
SET ANSI_WARNINGS ON
GO
SET ARITHABORT ON
GO
SET CONCAT_NULL_YIELDS_NULL ON
GO
SET NUMERIC_ROUNDABORT OFF
GO
SET QUOTED_IDENTIFIER ON
GO

DECLARE @ccode varchar(500)
DECLARE @PageSize int
DECLARE @PageNumber int
SET @ccode = '%skd%'
SET @PageSize = 20
SET @PageNumber = 1

SELECT DISTINCT CLASSIFICATIONS.ABBREV_TEXT,
            CLASSIFICATIONS.TITLE_TEXT,             
            CLASSIFICATIONS.CFN_UID
    FROM klasje.dbo.CLASSIFICATIONS
    inner join Klasje.dbo.CFN_VERSIONS on CLASSIFICATIONS.CFN_UID = CFN_VERSIONS.CFN_UID
    inner join Klasje.dbo.VERSION_CATEGORY_XREFS on CFN_VERSIONS.CVN_UID = VERSION_CATEGORY_XREFS.CVN_UID
    left outer join Klasje.dbo.VELJAVNOST on CFN_VERSIONS.LIFE_CYCLE_CODE = VELJAVNOST.RV_LOW_VALUE
    WHERE CATEGORY_CODE like @ccode OR DESCRIPTOR_TEXT like @ccode OR DEFINITION_TEXT like @ccode
    ORDER BY ABBREV_TEXT
    OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY

Cả hai kế hoạch thực hiện trên ý chính .

SELECT @@OPTIONS trả về 5496 trong cả hai trường hợp (chậm và nhanh).

Câu trả lời:


11

Giải thích rất có thể là các phiên của bạn có các cài đặt khác nhau. SQL Server có nhiều cài đặt phiên khác nhau có thể ảnh hưởng đến kế hoạch thực hiện đã chọn (và kết quả!)

Các giá trị cho các cài đặt này có thể phụ thuộc vào cách bạn kết nối với SQL Server, vì các công cụ khác nhau đặt các tùy chọn theo các cách khác nhau khi chúng kết nối và một số (như SQL Server Management Studio) cũng cho phép bạn ghi đè mặc định.

Ví dụ:

Tùy chọn mặc định

Hình ảnh trên được sao chép từ bài viết dứt khoát của Erland Sommarskog về chủ đề này:

Chậm trong ứng dụng, nhanh trong SSMS? Hiểu những bí ẩn về hiệu suất

Toàn bộ điều này rất đáng đọc, nhưng bạn chắc chắn nên đọc phần có tiêu đề, "Cài đặt mặc định"

Nếu bạn đảm bảo tất cả các cài đặt có cùng giá trị trên tất cả các kết nối, bạn sẽ nhận được cùng một kế hoạch thực hiện.

Để tương thích tối đa với các tính năng như chế độ xem được lập chỉ mục, bạn nên đảm bảo cài đặt của mình như sau:

Cài đặt đề xuất

Nhiều trong số các cài đặt này được duy trì để chỉ tương thích ngược. Chúng tôi khuyên bạn nên thiết lập chúng như được hiển thị trong bảng trên hoặc sử dụng một công cụ tự động đặt chúng theo đúng cách.

Sách tham khảo trực tuyến:

Cập nhật sau khi kế hoạch được cung cấp

Kế hoạch chậm bao gồm:

CardinalityEstimationModelVersion="70"

... trong khi kế hoạch nhanh nói:

CardinalityEstimationModelVersion="120"

Vì vậy, lời giải thích là một trong số các bạn đang sử dụng công cụ ước tính cardinality ban đầu và người khác đang sử dụng SQL Server 2014 CE mới. Sự khác biệt về số lượng hàng ước tính là đủ để CE mới chọn kế hoạch thực hiện song song. Theo CE ban đầu, chi phí ước tính cho kế hoạch nối tiếp nằm dưới ngưỡng chi phí cho sự song song.

Về lý do tại sao các công cụ ước tính khác nhau đang được sử dụng, tôi đoán rằng bạn có cơ sở dữ liệu ngữ cảnh khác nhau khi các câu lệnh được chạy. Một trong đó mức độ tương thích của cơ sở dữ liệu mặc định cho CE mới và một trong đó sử dụng CE gốc. Cơ sở dữ liệu bạn đang "nhập" khi thực hiện truy vấn xác định mô hình CE, không phải (các) cơ sở dữ liệu được sử dụng trong truy vấn.

Ví dụ: bạn có thể có các cơ sở dữ liệu mặc định khác nhau được liên kết với thông tin đăng nhập của bạn. Nếu bạn USE Klasje;trước khi chạy các câu lệnh, cả hai kết nối nên sử dụng cùng một mô hình CE.

Cập nhật cuối cùng: hóa ra cơ sở dữ liệu đích thực sự được đặt ở mức tương thích cũ hơn. Chạy truy vấn với chủ như cơ sở dữ liệu ngữ cảnh tạo ra kế hoạch tốt hơn. Xin lưu ý rằng việc thay đổi để sử dụng CE mới cho tất cả các truy vấn có thể gây ra hồi quy. Bạn sẽ cần kiểm tra khối lượng công việc của mình trước khi thay đổi mức độ tương thích cơ sở dữ liệu trong sản xuất.


4

Chỉ để giảm giá sự khác biệt với ứng dụng MVC - Bạn đã kiểm tra truy vấn mà nó đang thực hiện bằng SQL Profiler chưa?

Gần đây tôi đã gặp một vấn đề tương tự và hóa ra truy vấn được thực thi thông qua ứng dụng MVC của tôi (sử dụng Entity Framework 6) đang thực thi câu lệnh SQL sp_executesql, điều này khiến SQL Server sử dụng một kế hoạch thực thi khác so với chạy SQL thuần túy trong Management Studio .

Chúng tôi đã thay đổi nó để sử dụng một thủ tục được lưu trữ thay vì LINQ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.