Điều này có thể hoạt động tốt hơn:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
Trừ khi bạn đang chạy với cờ theo dõi 4199 trên đó có một lỗi điều đó ảnh hưởng đến ước tính bản số. Tại thời điểm viết bài
SELECT DATEADD(m, DATEDIFF(m, getdate(), 0), 0),
DATEADD(m, DATEDIFF(m, 0, getdate()), 0)
Trả lại
+-------------------------+-------------------------+
| 1786-06-01 00:00:00.000 | 2013-08-01 00:00:00.000 |
+-------------------------+-------------------------+
Lỗi là vị từ trong câu hỏi sử dụng ngày đầu tiên thay vì ngày thứ hai khi tính toán số lượng ước tính. Vì vậy, đối với thiết lập sau.
CREATE TABLE FK
(
ID INT IDENTITY PRIMARY KEY,
DT DATE,
Filler CHAR(1000) NULL,
UNIQUE (DT,ID)
)
INSERT INTO FK (DT)
SELECT TOP (1000000) DATEADD(m, DATEDIFF(m, getdate(), 0), 0)
FROM master..spt_values o1, master..spt_values o2
UNION ALL
SELECT DATEADD(m, DATEDIFF(m, 0, getdate()), 0)
Truy vấn 1
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)
Ước tính số hàng phù hợp sẽ là 100.000. Đây là số khớp với ngày '1786-06-01'
.
Nhưng cả hai truy vấn sau đây
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(GETDATE() + 1 - DATEPART(DAY, GETDATE()) AS DATE)
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)
OPTION (QUERYTRACEON 4199)
Đưa ra kế hoạch này
Do ước tính bản số chính xác hơn nhiều, kế hoạch hiện chỉ thực hiện một chỉ mục duy nhất tìm kiếm thay vì quét toàn bộ.