【问题标题】:Slow performance with small table after extreme reduction of size极度减小尺寸后,小表性能缓慢
【发布时间】:2016-03-21 04:50:19
【问题描述】:

我有大约 1000 万行的表,id 列是 primary key

然后我删除所有行where id > 10。表格中只剩下 10 行。

现在,当我运行查询 SELECT id FROM tablename 时,执行时间大约为 1.2 - 1.5 秒。
但是SELECT id FROM tablename where id = x 只需要 10 - 11 毫秒。

为什么第一个 SELECT 仅仅 10 行就这么慢?

【问题讨论】:

  • 统计数据更新了吗?
  • 删除行后您是否运行vacuum analyze?您甚至可能需要运行vacuum full analyze。对于与性能相关的问题,您应该始终包含使用 explain (analyze, verbose, buffers) 生成的执行计划
  • @a_horse_with_no_name 我想接受您的评论,但我找不到此按钮。谢谢

标签: sql postgresql postgresql-performance vacuum postgresql-9.5


【解决方案1】:

主要原因是MVCC model of Postgres,删除的行被保留,直到系统可以确定事务没有回滚并且死行不再对任何并发事务可见。只有这样,VACUUM 或更彻底地VACUUM FULL 才能物理删除死行。

相关:

您的简单查询 SELECT id FROM tablename - 如果在 DELETE 之后和 autovacuum 可以启动之前立即运行 - 仍然会找到 1000 万行并且必须检查可见性,才能排除其中的大部分。

您的第二个查询SELECT id FROM tablename where id = x 可以使用主键索引,并且只需要从(以前的)大表中读取单个数据页。这种查询在很大程度上不受表的总大小的影响。

可能有一种(更)更有效的方法来删除几乎所有 1000 万行:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2021-11-25
    • 2012-10-05
    • 2018-01-30
    • 2012-04-22
    • 2015-01-27
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多