Tôi đang gặp sự cố khi hiểu hành vi của các kế hoạch truy vấn ước tính cho câu lệnh của tôi trong SQL Server khi thay đổi từ truy vấn được tham số hóa thành truy vấn không được tham số hóa.Sự khác biệt về kế hoạch truy vấn SQL Server
Tôi có truy vấn sau đây:
DECLARE @p0 UniqueIdentifier = '1fc66e37-6eaf-4032-b374-e7b60fbd25ea'
SELECT [t5].[value2] AS [Date], [t5].[value] AS [New]
FROM (
SELECT COUNT(*) AS [value], [t4].[value] AS [value2]
FROM (
SELECT CONVERT(DATE, [t3].[ServerTime]) AS [value]
FROM (
SELECT [t0].[CookieID]
FROM [dbo].[Usage] AS [t0]
WHERE ([t0].[CookieID] IS NOT NULL) AND ([t0].[ProductID] = @p0)
GROUP BY [t0].[CookieID]
) AS [t1]
OUTER APPLY (
SELECT TOP (1) [t2].[ServerTime]
FROM [dbo].[Usage] AS [t2]
WHERE ((([t1].[CookieID] IS NULL) AND ([t2].[CookieID] IS NULL))
OR (([t1].[CookieID] IS NOT NULL) AND ([t2].[CookieID] IS NOT NULL)
AND ([t1].[CookieID] = [t2].[CookieID])))
AND ([t2].[CookieID] IS NOT NULL)
AND ([t2].[ProductID] = @p0)
ORDER BY [t2].[ServerTime]
) AS [t3]
) AS [t4]
GROUP BY [t4].[value]
) AS [t5]
ORDER BY [t5].[value2]
Truy vấn này được tạo ra bởi một biểu thức Linq2SQL và chiết xuất từ LINQPad. Điều này tạo ra một kế hoạch truy vấn tốt đẹp (theo như tôi có thể nói) và thực hiện trong khoảng 10 giây trên cơ sở dữ liệu. Tuy nhiên, nếu tôi thay thế hai lần sử dụng thông số bằng giá trị chính xác, thì thay thế hai phần '= @ p0' bằng '=' 1fc66e37-6eaf-4032-b374-e7b60fbd25ea '' Tôi nhận được một kế hoạch truy vấn ước tính khác và truy vấn bây giờ chạy lâu hơn nhiều (hơn 60 giây, không nhìn thấy nó thông qua).
Tại sao việc thực hiện thay thế dường như vô tội lại tạo ra kế hoạch và thực thi truy vấn hiệu quả hơn nhiều? Tôi đã xóa bộ nhớ cache thủ tục với 'DBCC FreeProcCache' để đảm bảo rằng tôi đã không lưu vào bộ nhớ cache một kế hoạch xấu, nhưng hành vi vẫn còn.
Vấn đề thực sự của tôi là tôi có thể sống với thời gian thực hiện 10 giây (ít nhất là trong một thời gian tốt) nhưng tôi không thể sống với thời gian thực hiện 60 giây. truy vấn của tôi sẽ (như gợi ý ở trên) bằng cách tạo ra bởi Linq2SQL vì vậy nó được thực hiện trên cơ sở dữ liệu như
exec sp_executesql N'
...
WHERE ([t0].[CookieID] IS NOT NULL) AND ([t0].[ProductID] = @p0)
...
AND ([t2].[ProductID] = @p0)
...
',N'@p0 uniqueidentifier',@p0='1FC66E37-6EAF-4032-B374-E7B60FBD25EA'
trong đó sản xuất đồng thời thực hiện kém (mà tôi nghĩ là gấp đôi kỳ lạ vì đây dường như được sử dụng các truy vấn tham số.
tôi không tìm kiếm lời khuyên mà chỉ để tạo ra hoặc những thứ tương tự, tôi chỉ cố gắng tìm hiểu tại sao kế hoạch truy vấn và thực hiện rất khác nhau trên ba câu hỏi dường như tương tự
EDIT:. Tôi đã tải lên kế hoạch thực hiện cho không tham số hóa và truy vấn tham số cũng như một kế hoạch thực hiện cho một truy vấn tham số (theo đề nghị của Heinz) với một khác nhau GUID here
Hy vọng nó sẽ giúp bạn giúp tôi :)
Bạn có thể đăng các gói truy vấn bạn nhận được không? Chỉ cần chạy 'SET SHOWPLAN_TEXT ON GO SELECT…' – Quassnoi
Xong ... Đã thêm liên kết vào kế hoạch thực hiện ... –