为什么某些日期的性能比MS SQL Server中的其他日期差

时间:2011-07-21 10:51:22

标签: sql-server datetime

我在MS SQL Server中有一个查询,询问名称和一些与日期相关的信息,具体取决于两个日期,即开始日期和结束日期。

问题是,我并不总能获得相同的性能。每当我在日期之间提出要求时,

2010-07-01 00:00:00.000 and
2011-07-21 23:59:59.999

表现非常出色。我在几秒钟内得到了我的结果。当我在这些日期之间请求某些内容时,例如,

2011-07-01 00:00:00.000 and
2011-07-21 23:59:59.999

性能不佳,每次查询需要20-28秒。请注意提供良好表现的日期 之间超过一年 ,而后者 20天。

是否有任何特殊原因(可能与DATETIME的工作方式有关)?

编辑:查询,

SELECT ENAME, 
    SUM(CASE DATE WHEN 0 THEN 1 ELSE 0 END) AS U2, 
    SUM(CASE DATE WHEN 1 THEN 1 ELSE 0 END) AS B_2_4, 
    SUM(CASE DATE WHEN 2 THEN 1 ELSE 0 END) AS B_4_8, 
    SUM(CASE DATE WHEN 3 THEN 1 ELSE 0 END) AS B_8_16, 
    SUM(CASE DATE WHEN 4 THEN 1 ELSE 0 END) AS B_16_24, 
    SUM(CASE DATE WHEN 5 THEN 1 ELSE 0 END) AS B_24_48, 
    SUM(CASE DATE WHEN 6 THEN 1 ELSE 0 END) AS O_48, 
    SUM(CASE DATE WHEN 7 THEN 1 ELSE 0 END) AS status, 
    AVG(AVG) AS AVG, 
    SUM(DATE) AS TOTAL

FROM 
    (SELECT ENAME, 
            (CASE 
                WHEN status = 'Öppet' THEN 7 
                WHEN DATE < 48 THEN 
                    (CASE WHEN DATE BETWEEN 0 AND 2 THEN 0 
                    WHEN DATE BETWEEN 2 AND 4 THEN 1 
                    WHEN DATE BETWEEN 4 AND 8 THEN 2 
                    WHEN DATE BETWEEN 8 AND 16 THEN 3 
                    WHEN DATE BETWEEN 16 AND 24 THEN 4 
                    WHEN DATE BETWEEN 24 AND 48 THEN 5 
                    ELSE - 1 END) 
            ELSE 6 END) AS DATE, 
            DATE AS AVG
    FROM 
        (SELECT DATEDIFF(HOUR, cases.date, status.date) AS DATE, 
        extern.name AS ENAME, 
        status.status
    FROM 
        cases INNER JOIN
        status ON cases.id = status.caseid 
                AND status.date =
                    (SELECT MAX(date) AS Expr1
                    FROM status AS status_1
                    WHERE (caseid = cases.id)
                    GROUP BY caseid) INNER JOIN
                    extern ON cases.owner = extern.id
                    WHERE (cases.org = 'Expert') 
                        AND (cases.date BETWEEN '2009-01-15 09:48:25.633' 
                        AND '2011-07-21 09:48:25.633'))
    AS derivedtbl_1) 
AS derivedtbl_2
GROUP BY ENAME
ORDER BY ENAME

(部分)表:

Extern
    -ID (->cases.owner)
    -name
Cases
    -Owner (->Extern.id)
    -id (->status.caseid)
    -date (case created at this date)
Status
    -caseid (->cases.id)
    -Status
    -Date (can be multiple, MAX(status.date) gives us date when 
     status was last changed)

1 个答案:

答案 0 :(得分:2)

我会想到一个统计问题。

当您只选择最近的日期时,这些日期可能无法在统计数据中显示,因为尚未达到会触发自动更新的阈值。

See this blog post for an example.