【发布时间】:2017-12-25 08:58:48
【问题描述】:
我正在尝试从一个大表中选择行(~10M 行)
该表包含一列timestamp,我在该列上设置了索引
我想按顺序(按时间戳排序)按 N 行的块取行,这就是我使用 limit 和 offset 的原因
我从不同的进程运行并行查询
查询耗时,我的服务器磁盘使用量激增(比正常磁盘使用量多 150G)
查询结束后,磁盘使用恢复正常
这是我查询的解释(这个没有order by)
my_db=# explain select * from my_table order limit 1 offset 1;
QUERY PLAN
---------------------------------------------------------------------------------
Limit (cost=0.14..0.28 rows=1 width=1001)
-> Seq Scan on my_table (cost=0.00..1447042.46 rows=10162346 width=1001)
下面是真实查询的样子:
SELECT my_column
FROM my_table
WHERE id > x
ORDER BY timestamp ASC
limit y
OFFSET z
关于如何优化此过程的任何想法? 非常感谢
【问题讨论】:
-
选择 * 没有 where 条件永远不会有效。它总是需要一个表扫描,因为它显然需要读取整个表。特别是当您添加“Order by”时,它将需要重新排序所有 10M 行,这解释了磁盘使用量的爆炸式增长。您应该添加 where 条件以减少结果数。
-
我实际上在查询中有一行和一个 where 条件,我更新了它的样子
-
您应该通过添加
AND ID < x + 1000或类似的东西来进一步减少结果的数量。否则它需要排序的行数仍然是整个表的主要部分。
标签: query-optimization limit offset postgres-9.6 bigdata