मुझे स्वीकार करना होगा कि मैंने पहले मैट द्वारा दिखाए गए फ्लोर-फ्लोट रूपांतरण को नहीं देखा था। मुझे इसका परीक्षण करना था।
मैंने एक शुद्ध चयन का परीक्षण किया (जो दिनांक और समय लौटाएगा, और वह नहीं है जो हम चाहते हैं), यहां शासन करने वाला समाधान (फर्श-फ्लोट), एक आम 'बेवकूफ' यहां वर्णित है (स्ट्रिंग कन्वर्ट) और यहां उल्लेख किया गया है कि मैं था का उपयोग करना (जैसा कि मुझे लगा कि यह सबसे तेज़ था)।
मैंने एक परीक्षण-सर्वर MS SQL Server 2005 पर Win 2003 SP2 सर्वर पर चल रहे एक Xeon 3GHz CPU के साथ अधिकतम मेमोरी (32 बिट, तो यह लगभग 3.5 Gb) पर चल रहे प्रश्नों का परीक्षण किया। यह रात है जहाँ मैं हूँ इसलिए मशीन लगभग बिना किसी भार के बेकार पड़ी है। मेरे पास यह सब मेरे पास है।
यहाँ मेरे टेस्ट-रन से लॉग एक बड़ी तालिका से चुनी गई है जिसमें टाइमस्टैम्प शामिल हैं जो मिलीसेकंड स्तर तक भिन्न हैं। इस विशेष डेटासेट में 2.5 वर्ष से अधिक की तिथियां शामिल हैं। तालिका में ही 130 मिलियन से अधिक पंक्तियां हैं, इसलिए मैं शीर्ष मिलियन तक सीमित हूं।
SELECT TOP 1000000 CRETS FROM tblMeasureLogv2
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2
<ब्लॉकक्वॉट> SQL सर्वर पार्स और संकलन समय:CPU समय =0 ms, बीता हुआ समय =1 ms.
(1000000 पंक्ति(पंक्तियाँ) प्रभावित) तालिका 'tblMeasureLogv2'। स्कैन काउंट 1, लॉजिकल रीड्स 4752, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-आगे रीड्स 0।
SQL सर्वर निष्पादन समय:CPU समय =422 ms, बीता हुआ समय =33803 ms.
(1000000 पंक्ति(पंक्तियाँ) प्रभावित) तालिका 'tblMeasureLogv2'। स्कैन काउंट 1, लॉजिकल रीड्स 4752, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-आगे रीड्स 0।
SQL सर्वर निष्पादन समय:CPU समय =625 ms, बीता हुआ समय =33545 ms.
(1000000 पंक्ति(पंक्तियाँ) प्रभावित) तालिका 'tblMeasureLogv2'। स्कैन काउंट 1, लॉजिकल रीड्स 4752, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-आगे रीड्स 0।
SQL सर्वर निष्पादन समय:CPU समय =1953 ms, बीता हुआ समय =33843 ms.
(1000000 पंक्ति(पंक्तियाँ) प्रभावित) तालिका 'tblMeasureLogv2'। स्कैन काउंट 1, लॉजिकल रीड्स 4752, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लोब लॉजिकल रीड्स 0, लोब फिजिकल रीड्स 0, लोब रीड-आगे रीड्स 0।
SQL सर्वर निष्पादन समय:CPU समय =531 ms, बीता हुआ समय =33440 ms। SQL सर्वर पार्स और संकलन समय:CPU समय =0 ms, बीता हुआ समय =1 ms.
SQL सर्वर निष्पादन समय:CPU समय =0 ms, बीता हुआ समय =1 ms.
हम यहाँ क्या देख रहे हैं?
आइए CPU समय पर ध्यान दें (हम रूपांतरण देख रहे हैं), और हम देख सकते हैं कि हमारे पास निम्नलिखित संख्याएँ हैं:
Pure-Select: 422
Floor-cast: 625
String-conv: 1953
DateAdd: 531
इससे मुझे ऐसा लगता है कि डेटएड (कम से कम इस विशेष मामले में) फ्लोर-कास्ट विधि से थोड़ा तेज है।
आपके वहां जाने से पहले, मैंने इस परीक्षण को कई बार चलाया, प्रश्नों के क्रम में बदलाव, समान-ईश परिणाम।
क्या यह मेरे सर्वर पर कुछ अजीब है, या क्या?