कास्टिंग की तिथि के लिए अस्थिरता के पीछे के तंत्र को गतिशील तलाश कहा जाता है ।
SQL सर्वर GetRangeThroughConvertरेंज की शुरुआत और अंत प्राप्त करने के लिए एक आंतरिक फ़ंक्शन को कॉल करता है।
कुछ आश्चर्य की बात है कि यह आपके शाब्दिक मूल्यों के समान नहीं है।
प्रति पृष्ठ एक पंक्ति और प्रति दिन 1440 पंक्तियों के साथ एक तालिका बनाना
CREATE TABLE T
(
DateTimeCol DATETIME PRIMARY KEY,
Filler CHAR(8000) DEFAULT 'X'
);
WITH Nums(Num)
AS (SELECT number
FROM spt_values
WHERE type = 'P'
AND number BETWEEN 1 AND 1440),
Dates(Date)
AS (SELECT {d '2012-12-30'} UNION ALL
SELECT {d '2012-12-31'} UNION ALL
SELECT {d '2013-01-01'} UNION ALL
SELECT {d '2013-01-02'} UNION ALL
SELECT {d '2013-01-03'})
INSERT INTO T
(DateTimeCol)
SELECT DISTINCT DATEADD(MINUTE, Num, Date)
FROM Nums,
Dates
फिर दौड़ रहा है
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT *
FROM T
WHERE DateTimeCol >= '20130101'
AND DateTimeCol < '20130102'
SELECT *
FROM T
WHERE CAST(DateTimeCol AS DATE) = '20130101';
पहली क्वेरी 1443पढ़ी है और दूसरी 2883तो यह एक पूरे अतिरिक्त दिन पढ़ रहा है तो एक अवशिष्ट विधेयकों के खिलाफ इसे त्यागने।
योजना से पता चलता है कि विधेय की तलाश है
Seek Keys[1]: Start: DateTimeCol > Scalar Operator([Expr1006]),
End: DateTimeCol < Scalar Operator([Expr1007])
तो इसके बजाय >= '20130101' ... < '20130102'यह पढ़ता है > '20121231' ... < '20130102'तो सभी 2012-12-31पंक्तियों को त्याग देता है ।
इस पर भरोसा करने का एक और नुकसान यह है कि पारंपरिक रेंज क्वेरी के साथ कार्डिनैलिटी का अनुमान उतना सटीक नहीं हो सकता है। यह आपके SQL फिडेल के संशोधित संस्करण में देखा जा सकता है ।
तालिका में सभी 100 पंक्तियाँ अब विधेय से मेल खाती हैं (उसी दिन सभी 1 मिनट के अलावा डेटेटाइम के साथ)।
दूसरी (श्रेणी) क्वेरी सही रूप से अनुमान लगाती है कि 100 मेल खाएगी और क्लस्टर इंडेक्स स्कैन का उपयोग करेगी। CAST( AS DATE)क्वेरी को गलत तरीके से अनुमान है कि केवल एक पंक्ति से मेल खाएगा और महत्वपूर्ण खोज के साथ एक योजना पैदा करता है।
आँकड़ों को पूरी तरह से नजरअंदाज नहीं किया जाता है। यदि तालिका की सभी पंक्तियों में समान है datetimeऔर यह विधेय (जैसे 20130101 00:00:00या 20130101 01:00:00) से मेल खाती है, तो योजना अनुमानित 31.6228 पंक्तियों के साथ एक संकुल सूचकांक स्कैन दिखाती है।
100 ^ 0.75 = 31.6228
तो उस स्थिति में यह प्रतीत होता है कि अनुमान यहाँ सूत्र से लिया गया है ।
यदि तालिका की सभी पंक्तियों में समान है datetimeऔर यह विधेय (जैसे 20130102 01:00:00) से मेल नहीं खाती है, तो यह 1 की अनुमानित पंक्ति संख्या और लुकअप के साथ योजना पर वापस आती है।
उन मामलों के लिए जहां तालिका में एक से अधिक DISTINCTमूल्य हैं, अनुमानित पंक्तियां वैसी ही लगती हैं जैसे कि क्वेरी बिल्कुल दिख रही थी 20130101 00:00:00।
यदि आँकड़े हिस्टोग्राम होता है तो एक कदम होगा, 2013-01-01 00:00:00.000तो अनुमान के आधार पर होगा EQ_ROWS(यानी उस तिथि को अन्य समय को ध्यान में नहीं रखना)। अन्यथा यदि कोई कदम नहीं है तो ऐसा लगता है जैसे कि वह AVG_RANGE_ROWSआसपास के चरणों से उपयोग करता है ।
जैसा कि datetimeकई प्रणालियों में लगभग 3ms की सटीकता है, बहुत कम वास्तविक डुप्लिकेट मान होंगे और यह संख्या 1 होगी।