Tôi có hai thủ tục lưu trữ. Cái này cực nhanh (~ 2 giây)
CREATE PROCEDURE [schema].[Test_fast]
@week date
AS
BEGIN
declare @myweek date = @week
select distinct serial
from [schema].[tEventlog] as e
join [schema].tEventlogSourceName as s on s.ID = e.FKSourceName
where s.SourceName = 'source_name'
and (e.EventCode = 1 or e.EventCode = 9)
and cast(@myweek as datetime2(3)) <= [Date]
and [Date] < dateadd(day, 7, cast(@myweek as datetime2(3)))
END
Và cái này chạy chậm (~ 2 giờ):
create PROCEDURE [schema].[Test_slow]
@week date
AS
BEGIN
select distinct serial
from [schema].[tEventlog] as e
join [schema].tEventlogSourceName as s on s.ID = e.FKSourceName
where s.SourceName = 'source_name'
and (e.EventCode = 1 or e.EventCode = 9)
and cast(@week as datetime2(3)) <= [Date]
and [Date] < dateadd(day, 7, cast(@week as datetime2(3)))
END
Sự khác biệt thực sự duy nhất là dòng (sử dụng biến cục bộ @myweek):
declare @myweek date = @week
Dưới đây là các kế hoạch thực hiện. Kế hoạch đầu tiên là từ [lược đồ]. [Test_fast] và kế hoạch thứ hai là từ [lược đồ]. [Test_slow]:
Câu hỏi của tôi là: Tại sao SQL Server 2012 có kế hoạch thực hiện tốt hơn (nhanh hơn) khi tôi lấy tham số và lưu trữ nó trong một biến cục bộ, sau đó sử dụng biến cục bộ này. Có một cái gì đó bị phá vỡ với các số liệu thống kê hoặc các chỉ số? (Tôi cũng tự hỏi tại sao kế hoạch thực hiện thứ hai không sử dụng bất kỳ loại thực thi song song nào).
CẬP NHẬT :
Tôi cung cấp cho 2 SP cùng một Thông số và khởi động chúng cùng một lúc (gần 2 giây khác nhau) không phải là cập nhật tự động thống kê trong DB này.
thí dụ:
EXEC [schema].[Test_fast]
@week = '2016-02-08'
EXEC [schema].[Test_slow]
@week = '2016-02-08'
Đây là Kế hoạch thực hiện:
https://gist.github.com/anonymous/6e404f896d9613c2061a#file-sp_execut_plan-sqlplan
Một bản cập nhật bổ sung của chỉ số cũng không có hiệu lực.