【发布时间】:2014-11-15 10:39:14
【问题描述】:
我有以下查询,它为每个 station 获取最新 N observations 的 id:
SELECT id
FROM (
SELECT station_id, id, created_at,
row_number() OVER(PARTITION BY station_id
ORDER BY created_at DESC) AS rn
FROM (
SELECT station_id, id, created_at
FROM observations
) s
) s
WHERE rn <= #{n}
ORDER BY station_id, created_at DESC;
我在id、station_id、created_at 上有索引。
这是我想出的唯一解决方案,可以为每个站点获取多条记录。但是它很慢(81000 条记录的表需要 154.0 毫秒)。
如何加快查询速度?
【问题讨论】:
-
在这种情况下,分区将无济于事。您的观察表小于 8MB。它将适合服务器的内存。您的查询计划包含对观察表的 seq 扫描。问题:从数据库中查询最新的实时数据有多重要?如果您只能查询不超过 2 小时的数据,会不会有问题?你能告诉我们观察表中有多少行吗? (只是幅度)
-
您可能希望使用 hash 在单独的列上创建索引。 CREATE INDEX name ON table USING hash (column);
-
您有 81000 条记录。关键问题: 1.) 有多少不同的站点? 2.) 你有一张列出所有电台的表格吗?如果没有,创建和维护一个有什么问题吗? 3.) 总是:你的 Postgres 版本? 4.)
observations的表定义(CREATE语句或 psql 中的\d observations)?一个更快的查询应该是可能的,这取决于站的数量...... -
更多细节:这是一个开源的 Rails 应用程序,可从廉价站点收集风数据。目前只有大约 3 个站点每 5 分钟采样一次(~ 288 个观测天,当 3G 网络参差不齐时会更少。) 直播站点:blast.nu。 github.com/remote-wind/remote-wind
标签: sql performance postgresql indexing query-optimization