2011-07-14 28 views
0

我知道要讓這個SQL語句快速完成某個任務是一件很難的事情,但是如果有人能夠看一下並且建議我如何優化它,我將不勝感激。想要優化此SQL Server語句的性能

下面的查詢是由ASP NET腳本生成的(所以我不只是硬編碼值)。雖然我沒有「解包」爲便於閱讀,第一個SELECT語句:

WITH 
valDiff0 AS (SELECT datediff(second, 
    CASE 
    WHEN '2011-06-06 00:00:00' < [inTime] THEN [inTime] 
    ELSE '2011-06-06 00:00:00' 
    END, 
    CASE 
    WHEN isdate([outTime]) = 1 THEN 
    CASE  
     WHEN '2011-06-06 23:59:59' > [outTime] THEN [outTime] 
     ELSE '2011-06-06 23:59:59' 
    END 
    ELSE 
    CASE  
     WHEN '2011-06-06 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800  
     ELSE '2011-06-06 23:59:59' 
    END 
    END) 
AS v1 FROM [dbo].[Info] WHERE 
    [cName] LIKE 'T%' 
    AND [b] <> 0 
    AND CONVERT(INT, [evt]) & 7 = 4 
    AND isdate([inTime]) = 1 
    AND [inTime] <= '2011-06-06 23:59:59' 
    AND [outTime] >= '2011-06-06 00:00:00'), 

valDiff1 AS (
    SELECT datediff(second, CASE WHEN '2011-06-07 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-07 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-07 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-07 23:59:59' END else case WHEN '2011-06-07 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-07 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-07 23:59:59' AND [outTime] >= '2011-06-07 00:00:00'), 
valDiff2 AS (SELECT datediff(second,CASE WHEN '2011-06-08 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-08 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-08 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-08 23:59:59' END else case WHEN '2011-06-08 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-08 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-08 23:59:59' AND [outTime] >= '2011-06-08 00:00:00'), 
valDiff3 AS (SELECT datediff(second,CASE WHEN '2011-06-09 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-09 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-09 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-09 23:59:59' END else case WHEN '2011-06-09 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-09 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-09 23:59:59' AND [outTime] >= '2011-06-09 00:00:00'), 
valDiff4 AS (SELECT datediff(second,CASE WHEN '2011-06-10 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-10 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-10 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-10 23:59:59' END else case WHEN '2011-06-10 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-10 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-10 23:59:59' AND [outTime] >= '2011-06-10 00:00:00'), 
valDiff5 AS (SELECT datediff(second,CASE WHEN '2011-06-11 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-11 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-11 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-11 23:59:59' END else case WHEN '2011-06-11 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-11 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-11 23:59:59' AND [outTime] >= '2011-06-11 00:00:00'), 
valDiff6 AS (SELECT datediff(second,CASE WHEN '2011-06-12 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-12 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-12 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-12 23:59:59' END else case WHEN '2011-06-12 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-12 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-12 23:59:59' AND [outTime] >= '2011-06-12 00:00:00'), 
valDiff7 AS (SELECT datediff(second,CASE WHEN '2011-06-13 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-13 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-13 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-13 23:59:59' END else case WHEN '2011-06-13 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-13 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-13 23:59:59' AND [outTime] >= '2011-06-13 00:00:00'), 
valDiff8 AS (SELECT datediff(second,CASE WHEN '2011-06-14 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-14 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-14 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-14 23:59:59' END else case WHEN '2011-06-14 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-14 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-14 23:59:59' AND [outTime] >= '2011-06-14 00:00:00'), 
valDiff9 AS (SELECT datediff(second,CASE WHEN '2011-06-15 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-15 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-15 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-15 23:59:59' END else case WHEN '2011-06-15 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-15 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-15 23:59:59' AND [outTime] >= '2011-06-15 00:00:00'), 
valDiff10 AS (SELECT datediff(second,CASE WHEN '2011-06-16 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-16 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-16 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-16 23:59:59' END else case WHEN '2011-06-16 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-16 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-16 23:59:59' AND [outTime] >= '2011-06-16 00:00:00'), 
valDiff11 AS (SELECT datediff(second,CASE WHEN '2011-06-17 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-17 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-17 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-17 23:59:59' END else case WHEN '2011-06-17 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-17 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-17 23:59:59' AND [outTime] >= '2011-06-17 00:00:00'), 
valDiff12 AS (SELECT datediff(second,CASE WHEN '2011-06-18 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-18 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-18 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-18 23:59:59' END else case WHEN '2011-06-18 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-18 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-18 23:59:59' AND [outTime] >= '2011-06-18 00:00:00'), 
valDiff13 AS (SELECT datediff(second,CASE WHEN '2011-06-19 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-19 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-19 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-19 23:59:59' END else case WHEN '2011-06-19 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-19 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-19 23:59:59' AND [outTime] >= '2011-06-19 00:00:00'), 
valDiff14 AS (SELECT datediff(second,CASE WHEN '2011-06-20 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-20 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-20 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-20 23:59:59' END else case WHEN '2011-06-20 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-20 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-20 23:59:59' AND [outTime] >= '2011-06-20 00:00:00'), 
valDiff15 AS (SELECT datediff(second,CASE WHEN '2011-06-21 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-21 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-21 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-21 23:59:59' END else case WHEN '2011-06-21 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-21 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-21 23:59:59' AND [outTime] >= '2011-06-21 00:00:00'), 
valDiff16 AS (SELECT datediff(second,CASE WHEN '2011-06-22 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-22 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-22 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-22 23:59:59' END else case WHEN '2011-06-22 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-22 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-22 23:59:59' AND [outTime] >= '2011-06-22 00:00:00'), 
valDiff17 AS (SELECT datediff(second,CASE WHEN '2011-06-23 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-23 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-23 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-23 23:59:59' END else case WHEN '2011-06-23 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-23 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-23 23:59:59' AND [outTime] >= '2011-06-23 00:00:00'), 
valDiff18 AS (SELECT datediff(second,CASE WHEN '2011-06-24 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-24 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-24 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-24 23:59:59' END else case WHEN '2011-06-24 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-24 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-24 23:59:59' AND [outTime] >= '2011-06-24 00:00:00'), 
valDiff19 AS (SELECT datediff(second,CASE WHEN '2011-06-25 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-25 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-25 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-25 23:59:59' END else case WHEN '2011-06-25 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-25 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-25 23:59:59' AND [outTime] >= '2011-06-25 00:00:00'), 
valDiff20 AS (SELECT datediff(second,CASE WHEN '2011-06-26 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-26 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-26 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-26 23:59:59' END else case WHEN '2011-06-26 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-26 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-26 23:59:59' AND [outTime] >= '2011-06-26 00:00:00'), 
valDiff21 AS (SELECT datediff(second,CASE WHEN '2011-06-27 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-27 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-27 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-27 23:59:59' END else case WHEN '2011-06-27 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-27 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-27 23:59:59' AND [outTime] >= '2011-06-27 00:00:00'), 
valDiff22 AS (SELECT datediff(second,CASE WHEN '2011-06-28 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-28 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-28 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-28 23:59:59' END else case WHEN '2011-06-28 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-28 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-28 23:59:59' AND [outTime] >= '2011-06-28 00:00:00'), 
valDiff23 AS (SELECT datediff(second,CASE WHEN '2011-06-29 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-29 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-29 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-29 23:59:59' END else case WHEN '2011-06-29 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-29 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-29 23:59:59' AND [outTime] >= '2011-06-29 00:00:00'), 
valDiff24 AS (SELECT datediff(second,CASE WHEN '2011-06-30 00:00:00' < [inTime] THEN [inTime] ELSE '2011-06-30 00:00:00' END, CASE WHEN isdate([outTime]) = 1 THEN CASE WHEN '2011-06-30 23:59:59' > [outTime] THEN [outTime] ELSE '2011-06-30 23:59:59' END else case WHEN '2011-06-30 23:59:59' > [inTime] + 604800 THEN [inTime] + 604800 ELSE '2011-06-30 23:59:59' END END) AS v1 FROM [dbo].[Info] WHERE [cName] LIKE 'T%' AND [b] <> 0 AND CONVERT(INT, [evt]) & 7 = 4 AND isdate([inTime]) = 1 AND [inTime] <= '2011-06-30 23:59:59' AND [outTime] >= '2011-06-30 00:00:00') 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff0 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff1 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff2 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff3 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff4 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff5 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff6 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff7 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff8 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff9 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff10 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff11 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff12 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff13 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff14 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff15 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff16 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff17 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff18 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff19 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff20 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff21 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff22 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff23 
UNION ALL 
SELECT SUM(CASE WHEN v1 < 604800 THEN v1 ELSE 604800 END) FROM valDiff24 

如何進行最優化這樣的事情?

+0

如果您通過4個空格縮進或使用'{}'按鈕,您可以在此處發佈它。 – Jacob

+1

只是嘗試發佈您的代碼無論如何,我們將幫助您編輯您的帖子以正確顯示格式:) –

+0

您是否嘗試過在編輯器中單擊編輯中的{}圖標?它在每行上預先修復了4個空格的文本,然後使用固定寬度的字體代碼(以及其他更好的格式)。 – MatBailie

回答

2

首先,我會嘗試通過創建日曆表來縮短它。這也可以部分地提高性能...

WITH 
    Calendar AS 
(
    SELECT 0 AS [id], CAST('2011 Jun 06' AS DATETIME) AS [DateStart], CAST('2011 Jun 06' AS DATETIME) + 1 AS [DateEnd] 
    UNION ALL 
    SELECT id + 1, [DateStart] + 1, [DateStart] + 2 FROM Calendar WHERE id < 24 
) 
, 
    FilteredData AS 
(
    SELECT 
    COALESCE(Info.[inTime], CAST('2011 Jun 06')) AS [inTime], 
    COALESCE(Info.[outTime], Info.[inTime] + 7) AS [outTime] 
    FROM 
    [dbo].[Info] 
    WHERE 
     Info.[cName] LIKE 'T%' 
    AND Info.[b] <> 0 
    AND CONVERT(INT, Info.[evt]) & 7 = 4 
    AND (Info.[outTime] IS NULL OR Info.[outTime] >= CAST('2011 Jun 06' AS DATETIME) 
    AND (Info.[inTime] IS NULL OR Info.[inTime] < CAST('2011 Jun 06' AS DATETIME) + 25) 
) 
, 
    CleanedData AS 
(
    SELECT 
    [Calendar].id, 
    CASE 
     WHEN Calendar.[DateStart] < Info.[inTime] THEN Info.[inTime] 
     ELSE Calendar.[DateStart] 
    END AS [inTime], 
    CASE  
     WHEN Calendar.[DateEnd] > Info.[outTime] THEN Info.[outTime] 
     ELSE Calendar.[DateEnd] 
    END AS [outTime] 
FROM 
    [Calendar] 
    INNER JOIN 
    [FilteredData] AS [Info] 
     ON Info.[inTime] < Calendar.[DateEnd] 
     AND Info.[outTime] >= Calendar.[DateStart] 
) 

SELECT 
    [id], 
    SUM(DATEDIFF(SECOND, [InTime], [OutTime])) AS duration 
FROM 
    [CleanedData] 
GROUP BY 
    [id] 

-- Note: The CleanedData step causes the InTime and OutTime to be no more than a day appart. 
-- This means that there is no need to check the DATEDIFF is less than 1 week long. 


在優化方面,你有沒有在桌子上什麼指標?他們肯定能幫助我們在這裏...

WHERE 
    Info.[cName] LIKE 'T%' 
    AND Info.[b] <> 0 

最後,指數不能CONVERT(INT, Info.[evt]) & 7 = 4幫助。你能夠添加一個計算的字段到表,你可以索引?或者將單個字段更改爲多個字段;一組用於不同模式/狀態的標誌? (或者讓這個信息派生表?)或者將這個字段編入索引對你沒有太大的影響?

你有邏輯說「如果outTime是NULL,使用inTime加1周」。如果inTime和OutTime都爲NULL,你想要做什麼?

也有關於優化基於您感興趣的日期過濾數據的問題。如果事件可以是任何時間,你必須檢查inout倍,它可以殺死你能夠使用索引。如果你知道一個事件有一個最大長度,但你可以做這樣的事情......

WHERE 
     Info.inTime > (myEarliestDate) - (myLongestDuration) 
    AND Info.inTime < (myLatestDate) 
    AND Into.OutTime > (myEarliestDate) 

什麼,讓你既><在你銀泰場包裹,明確limitting一切都非常特定的數據範圍。因此,我會將此添加到名爲FilteredData的WHERE子句的末尾。 (假設沒有任何事件持續超過7天)

 AND (Info.[inTime] IS NULL OR Info.[inTime] >= CAST('2011 Jun 06' AS DATETIME) - 7) 
+0

感謝您重新發布這個怪物:)你是對的,我需要查看索引。讓我問,如果我消除ISDATE()將inTime和outTime作爲索引受益呢?正如我所說的那樣,因爲它們可能是空值,但我可以在記錄它們之前放置驗證邏輯。我可以用CONVERT部分來做同樣的事情。那麼索引是否有必要呢?從索引中受益的一般規則是什麼?我希望我知道一些你問我的東西,你可以告訴我,我不熟練SQL ......( – ahmd0

+0

根據你所說的,編輯答案,用COALESCE替換ISDATE和改變最後的討論。 – MatBailie