-1

このクエリの最適化を手伝ってくれる人はいますか?

SELECT distinct t.designation,
      (SELECT sum(time_to_sec(timediff(outtime,intime))) 
       FROM onlinetime where datecreated BETWEEN '2012-01-01 00:00:01' 
       AND '2012-12-31 23:59:59' and designation=t.designation) as totsec
FROM onlinetime t;

onlinetime テーブルから指定と秒数を取得しようとしています。8000 レコードしかありませんが、上記のクエリは実行に時間がかかります。これを最適化する他の方法はありますか?

4

2 に答える 2

3

各指定の合計サマリーを直接取得できるのに、なぜテーブルに参加する必要があるのですか

SELECT  designation, sum(time_to_sec(timediff(outtime,intime))) totsec
FROM    onlinetime
WHERE   datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
GROUP   BY designation

datecreatedパフォーマンスを向上させるために、列にインデックスを追加するだけです。

ALTER TABLE onlinetime ADD INDEX (datecreated)

または多分あなたはこれをしたい、

SELECT  a.designation, 
        COALESCE(sum(time_to_sec(timediff(b.outtime,b.intime))), 0) totsec
FROM    onlinetime a
        LEFT JOIN onlinetime b
            ON  a.designation = b.designation AND
                b.datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
GROUP   BY a.designation
于 2013-02-25T15:55:10.477 に答える
0

正解は次のとおりです。

SELECT t.designation,
       sum(case when datecreated between '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
                then sum(time_to_sec(timediff(outtime,intime)
           end) as totsec
from onlinetime t
group by t.designation

フィルタリングをwhere句に入れると、テーブル内のすべての「指定」を保持するという元のクエリの意図が失われます。

于 2013-02-25T16:49:45.430 に答える