次のクエリは、偶数の時間間隔で分布された履歴値の平均を計算するのに役立ちます。ここで左結合により、クエリ解決の時間が大幅に増加します
EXPLAIN ANALYZE SELECT start_date as date, AVG(hcv1.value::float) as value
FROM generate_series(cast('2017-01-01' as abstime), cast('2017-12-01' as abstime), interval '86400 seconds') start_date
LEFT JOIN history_values hv
ON (
hv.variable_id = 3 AND
hv.created_at BETWEEN start_date AND start_date + interval '86400 seconds'
)
GROUP BY start_date
ORDER BY start_date
クエリのレポート:
EXPLAIN ANALYZE SELECT start_date as date,
AVG(hv1.value::float) as value1,
AVG(hv2.value::float) as value2
FROM generate_series(cast('2017-01-01' as abstime), cast('2017-12-01' as abstime), interval '86400 seconds') start_date
LEFT JOIN history_values hv1
ON (
hv1.variable_id = 2 AND
hv.created_at BETWEEN start_date AND start_date + interval '86400 seconds'
)
LEFT JOIN history_values hv2
ON (
hv2.variable_id = 3 AND
hv.created_at BETWEEN start_date AND start_date + interval '86400 seconds'
)
GROUP BY start_date
ORDER BY start_date
:今、私は別のを指して余分な列の値2を追加しようとクエリ時間が150秒に2秒から行くvariable_id場合
https://explain.depesz.com/s/q29a
ここに報告書はあります:https://explain.depesz.com/s/V1sV
なぜ誰に教えてもらえますか?私は本当に時間が約4秒になることを期待していました。
はまた、次の点に注意してください
SELECT COUNT(*) FROM history_values WHERE variable_id = 2 -- ~25k records
SELECT COUNT(*) FROM history_values WHERE variable_id = 3 -- ~25k records
PostgreSQLのどのバージョンですか? –
Apple LLVMバージョン7.0.2(clang-700.1.81)、64ビットでコンパイルされたx86_64-apple-darwin14.5.0上のPostgreSQL 9.6.1 – pnknrg
最初にカレンダーテーブルを具体化し、分析する)。 2番目:タイムスタンプに適切なデータ型+関数を使用する。 – wildplasser