1

機械の情報 (現在の速度、ガス使用量など) を保持する 1,500 万件のレコードを含むテーブルがあります。
現在の速度は 1 分ごとに保存され、ガスの使用量は 15 分ごとに保存されます。ここで、この 15 分間のガス使用量と平均速度のリストが必要です。

select a.time, a.value as gas, 
(select avg(b.value) from machine_values as b where b.time < a.time 
  and b.time > date_add(a.time, interval -15 minute) and b.channel='speed') as avgSpeed 
from machine_values as a 
where a.time >= '2012-12-16 00:00:00.000' and a.time < '2012-12-17 00:00:00.000' 
and a.channel='gas'

machine_values.timeおよびmachine_values.channelは、このテーブルの主キーです。

1日の値でこれを試しましたが、クエリは約30分実行されます。サブクエリに 1 日の期間を追加すると、クエリの実行速度が大幅に向上します。

select a.time, a.value as gas, 
(select avg(b.value) from machine_values as b where b.time < a.time 
  and b.time > date_add(a.time, interval -15 minute) and b.channel='speed'
  and b.time >= '2012-12-16 00:00:00.000' and b.time < '2012-12-17 00:00:00.000') as avgSpeed 
from machine_values as a 
where a.time >= '2012-12-16 00:00:00.000' and a.time < '2012-12-17 00:00:00.000' 
and a.channel='gas'

でもそれも一日限り。これを 2 か月試した場合、結果が出るまでに約 1 時間かかります。どうしたの?サブクエリはa.time行単位で参照していませんか?

私はそれを推測しました-もし私が1つの行を持っていてa.time = 2012-12-16 00:20:00a.gas = 100サブクエリが2012-12-16 00:05:00までの値のみを選択するなら2012-12-16 00:20:00? しかし、クエリのパフォーマンスは、サブクエリが毎回テーブル全体をスキャンするように見えます。

必要な結果を得る別の (より高速な) 方法はありますか?

4

0 に答える 0