産業機械からの監視データを含む巨大なテーブルがあります。テーブルには 30 個のいわゆるパラメーター列があり、典型的なクエリでは毎回 2 ~ 7 個が選択されます。その結果からグラフや状態表などが計算されます。ほとんどの計算では、指定された時間枠(メインデータ)の値に加えて、指定された時間枠(事前データ) の前のパラメーターの最新の非 null 値もわかっている必要があります。
現在、パラメーターごとに実行される事前データのクエリを使用しています。これは、 nが計算に必要なパラメーターの量である DB に n 個のクエリを導入するため、私が望むほど効率的ではありません。単一のクエリで事前データを取得することは何とか可能ですか (現在のクエリの例については、以下を参照してください)。
pre-data クエリの例 (fuel_cons、pwr_on、idle_counter に対しても実行):
SELECT
alert_f335
FROM
signal_value SIGV
,machine M /*Using old join since this is actually a Hibernate query*/
WHERE
M.serialNumber = 'R451902'
AND SIGV.machineId = M.id
AND SIGV.time = (
SELECT
MAX(TMP.time)
FROM
signal_value TMP
WHERE
TMP.machineId = M.id
AND TMP.time < 1370044800000 /*2013-06-01 00:00:00*/
AND TMP.alert_f335 IS NOT NULL
)
ORDER BY
SIGV.time ASC
メインデータ クエリの例 (これで問題ありません):
SELECT
alert_f335
,fuel_cons
,pwr_on
,idle_counter
FROM
machine M
INNER JOIN
signal_value SIGV
ON M.id = SIGV.machineId
WHERE
M.serialNumber = 'R451902'
AND SIGV.time >= 1370044800000 /*2013-06-01 00:00:00*/
AND SIGV.time <= 1371340799000 /*2013-06-15 23:59:59*/
AND (alert_f335 IS NOT NULL OR fuel_cons IS NOT NULL OR pwr_on IS NOT NULL OR idle_counter IS NOT NULL)
ORDER BY
SIGV.time ASC
machine テーブルには、id と serialNumber という 2 つの興味深い列があります。signal_value には、パラメーター列に加えて、2 つの興味深い列があります: machineId、time (ミリ秒)。