2011-07-21 5 views
1

MS SQL Serverで、開始日と終了日の2つの日付と日付に関連する情報を求めるクエリがあります。いくつかの日付がMS SQL Serverの他のものよりもパフォーマンスが悪い理由

問題は、私はいつも同じパフォーマンスを得るわけではありません。私が日付の間に何かを要求するときはいつでも。

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

パフォーマンスが優れています。私は1秒以内に結果を得る。たとえば、

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

のようなこれらの日付の間に何かをリクエストすると、クエリごとに20〜28秒かかることがあります。良好なパフォーマンスを与える日付が、の間にどのようにであるのか、後者は20日であることに注意してください。

これは何らかの理由で(おそらくDATETIMEの動作に関連する)ありますか?

EDIT:クエリ、

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

あなたはあなたの質問を表示できますか?それは助けるかもしれない – biluriuday

+0

私はそれを避けることができると思ったが、確かに。 –

+0

同じ矛盾した振る舞いを示す最も簡単な場合に、それを煮詰めようとする可能性のある方法はありますか? – hoodaticus

答えて

2

私は統計の問題を考えているだろう。

最新の日付のみを選択している場合は、統計にまだ表示されていない可能性があります。しきい値に達していないため、自動更新が実行されません。

See this blog post for an example.

関連する問題