station_logs
PostgreSQL 9.6データベースにテーブルがあります。
Column | Type |
---------------+-----------------------------+
id | bigint | bigserial
station_id | integer | not null
submitted_at | timestamp without time zone |
level_sensor | double precision |
Indexes:
"station_logs_pkey" PRIMARY KEY, btree (id)
"uniq_sid_sat" UNIQUE CONSTRAINT, btree (station_id, submitted_at)
それぞれlevel_sensor
についてsubmitted_at
、に基づいて最後の値を取得しようとしていますstation_id
。固有のstation_id
値は約400 個、1日あたり約20,000行station_id
です。
インデックスを作成する前に:
EXPLAIN ANALYZE
SELECT DISTINCT ON(station_id) station_id, submitted_at, level_sensor
FROM station_logs ORDER BY station_id, submitted_at DESC;
一意(コスト= 4347852.14..4450301.72行= 89幅= 20)(実際の時間= 22202.080..27619.167行= 98ループ= 1) ->ソート(コスト= 4347852.14..4399076.93行= 20489916幅= 20)(実際の時間= 22202.077..26540.827行= 20489812ループ= 1) ソートキー:station_id、submitted_at DESC ソート方法:外部マージディスク:681040kB -> station_logsのシーケンススキャン(コスト= 0.00..598895.16行= 20489916幅= 20)(実際の時間= 0.023..3443.587行= 20489812ループ= $ 計画時間:0.072 ms 実行時間:27690.644 ms
インデックスを作成しています:
CREATE INDEX station_id__submitted_at ON station_logs(station_id, submitted_at DESC);
インデックスを作成した後、同じクエリに対して:
ユニーク(コスト= 0.56..2156367.51行= 89幅= 20)(実際の時間= 0.184..16263.413行= 98ループ= 1) -> station_logsのstation_id__submitted_atを使用したインデックススキャン(コスト= 0.56..2105142.98行= 20489812幅= 20)(実際の時間= 0.181..1 $ 計画時間:0.206ミリ秒 実行時間:16263.490ミリ秒
このクエリをより速くする方法はありますか?たとえば1秒のように、16秒はまだ多すぎます。