Database
 sql >> डेटाबेस >  >> RDS >> Database

डेटटाइम से ट्रिमिंग टाइम - एक फॉलो-अप

डेटाटाइम से समय को कम करने के बारे में मेरी पिछली पोस्ट के बाद, मुझे डेटा एक्सेस को शामिल किए बिना विभिन्न तरीकों की प्रदर्शन विशेषताओं को अधिक स्पष्ट रूप से प्रदर्शित करने के लिए प्रेरित किया गया था। मूल पोस्ट में, मैंने एक डेटाटाइम मान को स्वतंत्र रूप से एक तिथि में परिवर्तित करने के सात अलग-अलग तरीकों की तुलना की, यह दिखाया कि अंतर नगण्य थे, फिर डेटा वापस करने वाले वास्तविक प्रश्नों में उन तरीकों के उपयोग का विश्लेषण करने के लिए सीधे चले गए।

इस पोस्ट में मैं डेटाटाइम से समय ट्रिम करने के कई अलग-अलग तरीके दिखाना चाहता था (वास्तव में 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) चला रहा था। यहां सारणीबद्ध परिणाम दिए गए हैं, जो औसत अवधि के अनुसार क्रमित हैं, सबसे तेज़ पहले:

और यहाँ औसत अवधि का चित्रमय प्रतिनिधित्व है: