यह बेहतर काम कर सकता है:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
जब तक आप ट्रेस फ्लैग 4199 के साथ नहीं चल रहे हैं, तब तक एक बग जो कार्डिनैलिटी अनुमानों को प्रभावित करता है। लिखते समय
SELECT DATEADD(m, DATEDIFF(m, getdate(), 0), 0),
DATEADD(m, DATEDIFF(m, 0, getdate()), 0)
रिटर्न
+-------------------------+-------------------------+
| 1786-06-01 00:00:00.000 | 2013-08-01 00:00:00.000 |
+-------------------------+-------------------------+
बग यह है कि प्रश्न में विधेय कार्डिनैलिटी अनुमान प्राप्त करते समय दूसरी के बजाय पहली तारीख का उपयोग करता है। तो निम्नलिखित सेटअप के लिए।
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)
क्वेरी 1
SELECT COUNT(Filler)
FROM FK
WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)
अनुमान है कि मेल खाने वाली पंक्तियों की संख्या 100,000 होगी। यह वह संख्या है जो दिनांक से मेल खाती है '1786-06-01'
।
लेकिन निम्नलिखित दोनों प्रश्न
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)
यह योजना दें
अधिक सटीक कार्डिनैलिटी अनुमानों के कारण अब योजना पूर्ण स्कैन के बजाय केवल एक इंडेक्स की तलाश करती है।