Sử dụng Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64).
Đưa ra một bảng và chỉ mục:
create table [User].[Session]
(
SessionId int identity(1, 1) not null primary key
CreatedUtc datetime2(7) not null default sysutcdatetime())
)
create nonclustered index [IX_User_Session_CreatedUtc]
on [User].[Session]([CreatedUtc]) include (SessionId)
Hàng thực tế cho mỗi truy vấn sau là 3,1M, các hàng ước tính được hiển thị dưới dạng nhận xét.
Khi các truy vấn này cung cấp một truy vấn khác trong Chế độ xem , trình tối ưu hóa sẽ chọn tham gia vòng lặp vì ước tính 1 hàng. Làm cách nào để cải thiện ước tính ở mức mặt đất này để tránh ghi đè truy vấn cha mẹ tham gia gợi ý hoặc dùng đến SP?
Sử dụng một ngày mã hóa hoạt động tuyệt vời:
select distinct SessionId from [User].Session -- 2.9M (great)
where CreatedUtc > '04/08/2015' -- but hardcoded
Các truy vấn tương đương này tương thích với xem nhưng tất cả ước tính 1 hàng:
select distinct SessionId from [User].Session -- 1
where CreatedUtc > dateadd(day, -365, sysutcdatetime())
select distinct SessionId from [User].Session -- 1
where dateadd(day, 365, CreatedUtc) > sysutcdatetime();
select distinct SessionId from [User].Session s -- 1
inner loop join (select dateadd(day, -365, sysutcdatetime()) as MinCreatedUtc) d
on d.MinCreatedUtc < s.CreatedUtc
-- (also tried reversing join order, not shown, no change)
select distinct SessionId from [User].Session s -- 1
cross apply (select dateadd(day, -365, sysutcdatetime()) as MinCreatedUtc) d
where d.MinCreatedUtc < s.CreatedUtc
-- (also tried reversing join order, not shown, no change)
Hãy thử một số gợi ý (nhưng N / A để xem):
select distinct SessionId from [User].Session -- 1
where CreatedUtc > dateadd(day, -365, sysutcdatetime())
option (recompile);
select distinct SessionId from [User].Session -- 1
where CreatedUtc > (select dateadd(day, -365, sysutcdatetime()))
option (recompile, optimize for unknown);
select distinct SessionId -- 1
from (select dateadd(day, -365, sysutcdatetime()) as MinCreatedUtc) d
inner loop join [User].Session s
on s.CreatedUtc > d.MinCreatedUtc
option (recompile);
Hãy thử sử dụng Thông số / Gợi ý (nhưng N / A để xem):
declare
@minDate datetime2(7) = dateadd(day, -365, sysutcdatetime());
select distinct SessionId from [User].Session -- 1.2M (adequate)
where CreatedUtc > @minDate;
select distinct SessionId from [User].Session -- 2.96M (great)
where CreatedUtc > @minDate
option (recompile);
select distinct SessionId from [User].Session -- 1.2M (adequate)
where CreatedUtc > @minDate
option (optimize for unknown);
Các số liệu thống kê được cập nhật.
DBCC SHOW_STATISTICS('user.Session', 'IX_User_Session_CreatedUtc') with histogram;
Một số hàng cuối cùng của biểu đồ (tổng số 189 hàng) được hiển thị: