Почему некоторые даты дают худшую производительность, чем другие в MS SQL Server - PullRequest
1 голос
/ 21 июля 2011

У меня есть запрос в 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 до 20 секунд на каждый запрос. Обратите внимание, что даты, дающие хорошие показатели, на больше, чем год между , в то время как последние 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 Ответ

2 голосов
/ 30 июля 2011

Я бы подумал, что проблема со статистикой.

Когда вы выбираете только самые последние даты, они могут быть не представлены в статистике, поскольку порог еще не достигнут, что приведет к автоматическому обновлению.

См. Этот блог для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...