2011-07-14 18 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時間を確認する必要がありますインデックスを利用する能力。あなたは、イベントが最大の長さを持っていることがわかっている場合は、しかし、あなたはこのような何かを行うことができます...

それはあなたが明示的に非常にすべてをlimitting、あなたのインタイムのフィールドに巻き付け両方><で与えるもの
WHERE 
     Info.inTime > (myEarliestDate) - (myLongestDuration) 
    AND Info.inTime < (myLatestDate) 
    AND Into.OutTime > (myEarliestDate) 

データの特定の範囲。このように、私はFilteredDataというWHERE句の最後にこれを追加します。 (イベントが7日以上続くことがないと仮定して)

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

この怪物を再頒布していただきありがとうございます:)あなたが正しいです、私はインデックスを調べる必要があります。私がISDATE()を削除すると、inTimeとoutTimeのインデックスが得られるというメリットはありますか?私が言ったように、彼らはnullsすることができますが、私はそれらをログに記録する前に検証ロジックを配置することができますがあります。私はCONVERTパートでも同じことができます。そこでインデックスが必要でしょうか?インデックスの恩恵を受ける一般的なルールは何ですか?私は、あなたが私に尋ねていることのいくつかを知っていればいいと思うが、私はSQLにあまり堪能ではない... ...( – ahmd0

+0

あなたが言ったことに基づいて答えを編集し、ISDATEをCOALESCE最後にディスカッションを変更しました。 – MatBailie

関連する問題