डेटाटाइम से समय को कम करने के बारे में मेरी पिछली पोस्ट के बाद, मुझे डेटा एक्सेस को शामिल किए बिना विभिन्न तरीकों की प्रदर्शन विशेषताओं को अधिक स्पष्ट रूप से प्रदर्शित करने के लिए प्रेरित किया गया था। मूल पोस्ट में, मैंने एक डेटाटाइम मान को स्वतंत्र रूप से एक तिथि में परिवर्तित करने के सात अलग-अलग तरीकों की तुलना की, यह दिखाया कि अंतर नगण्य थे, फिर डेटा वापस करने वाले वास्तविक प्रश्नों में उन तरीकों के उपयोग का विश्लेषण करने के लिए सीधे चले गए।
इस पोस्ट में मैं डेटाटाइम से समय ट्रिम करने के कई अलग-अलग तरीके दिखाना चाहता था (वास्तव में 18 अलग-अलग तरीके!), बिना किसी वास्तविक डेटा को पेश किए, यह देखने के लिए कि क्या हम इस कार्य को करने के लिए "सबसे तेज़" तरीका घोषित कर सकते हैं।
तरीके
यहां वे 18 विधियां हैं जिनका मैं परीक्षण करूंगा, कुछ ब्लॉग पोस्ट से ली गई हैं, माधिवनन ने मेरी पिछली पोस्ट के बाद बताया:
DECLARE @d DATETIME, @ds DATETIME = SYSDATETIME();
परीक्षा
मैंने एक लूप बनाया जहां मैं प्रत्येक रूपांतरण को 1,000,000 बार चलाऊंगा, और फिर सभी 18 रूपांतरण विधियों के लिए प्रक्रिया को 10 बार दोहराऊंगा। यह किसी भी महत्वपूर्ण सांख्यिकीय विषमता को समाप्त करते हुए, प्रत्येक विधि के लिए 10,000,000 रूपांतरणों के लिए मीट्रिक प्रदान करेगा।
CREATE TABLE #s(j INT, ms INT); GO SET NOCOUNT ON; GO DECLARE @j INT = 1, @x INT, @i INT = 1000000; DECLARE @t DATETIME2, @d DATETIME, @ds DATETIME = SYSDATETIME(); WHILE @j <= 18 BEGIN SELECT @x = 1, @t = SYSDATETIME(); WHILE @x <= @i BEGIN IF @j = 1 SET @d = DATEDIFF(DAY, 0, @ds); IF @j = 2 SET @d = CAST(@ds AS INT); IF @j = 3 SET @d = CAST(CONVERT(CHAR(8), @ds, 112) AS DATETIME); IF @j = 4 SET @d = DATEADD(DAY, DATEDIFF(DAY, 0, @ds), 0); IF @j = 5 SET @d = CAST(CAST(SUBSTRING(CAST(@ds AS BINARY(8)), 1, 4) AS BINARY(8)) AS DATETIME); IF @j = 6 SET @d = CONVERT(CHAR(8), @ds, 112); IF @J = 7 SET @d = CAST(CAST(@ds AS VARCHAR(11)) AS DATETIME); IF @J = 8 SET @d = @ds - CONVERT(CHAR(10), @ds, 108); IF @J = 9 SET @d = @ds - CAST(CAST(@ds AS TIME) AS DATETIME); IF @J = 10 SET @d = CAST(FLOOR(CAST(@ds AS FLOAT)) AS DATETIME); IF @J = 11 SET @d = CAST(CAST(CAST(CAST(@ds AS BINARY(8)) AS BINARY(4)) AS BINARY(8)) AS DATETIME); IF @J = 12 SET @d = @ds - CAST(@ds AS BINARY(4)); IF @J = 13 SET @d = DATEADD(DAY, CONVERT(INT, @ds - 0.5), 0); IF @J = 14 SET @d = CONVERT(DATETIME, FORMAT(@ds, N'yyyy-MM-dd')); IF @J = 15 SET @d = CONVERT(DATETIME,CONVERT(INT,CONVERT(FLOAT,@ds))); IF @J = 16 SET @d = CAST(CAST(CAST(CAST(@ds AS BINARY(8)) AS BIGINT) & 0XFFFFFFFF00000000 AS BINARY(8)) AS DATETIME); IF @J = 17 SET @d = CONVERT(DATE, @ds); IF @j = 18 SET @d = CAST(@ds AS DATE); SET @x += 1; END INSERT #s SELECT @j, DATEDIFF(MILLISECOND, @t, SYSDATETIME()); SET @j += 1; END GO 10 SELECT j, method = CASE ... END, MIN(ms), MAX(ms), AVG(ms) FROM #s GROUP BY j ORDER BY j;
परिणाम
मैंने इसे विंडोज 8 वीएम पर 8 जीबी रैम और 4 वीसीपीयू के साथ चलाया, SQL सर्वर 2012 (11.0.2376) चला रहा था। यहां सारणीबद्ध परिणाम दिए गए हैं, जो औसत अवधि के अनुसार क्रमित हैं, सबसे तेज़ पहले:
और यहाँ औसत अवधि का चित्रमय प्रतिनिधित्व है: