【问题标题】:Postgres optimize query on large tablePostgres 优化大表查询
【发布时间】:2017-12-25 08:58:48
【问题描述】:

我正在尝试从一个大表中选择行(~10M 行)
该表包含一列timestamp,我在该列上设置了索引

我想按顺序(按时间戳排序)按 N 行的块取行,这就是我使用 limitoffset 的原因

我从不同的进程运行并行查询

查询耗时,我的服务器磁盘使用量激增(比正常磁盘使用量多 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


【解决方案1】:

https://www.eversql.com/faster-pagination-in-mysql-why-order-by-with-limit-and-offset-is-slow/

这使用一个唯一的列作为书签来防止使用偏移

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多