【问题标题】:DELETE taking quite a long time, perhaps subquery slowDELETE 耗时较长,可能是子查询慢
【发布时间】:2023-02-23 13:10:08
【问题描述】:

我有两个表 stage_instancestage_binarystage_binary 有一个主键idstage_instance 有一个普通的int 列,名为binary_id。此列中没有外键约束,但该列已建立索引。

我发布此删除声明:

DELETE FROM stage_instance WHERE binary_id NOT IN (SELECT id FROM stage_binary)
  • stage_binary 有 240k 行
  • stage_instance 有 130k 行

删除需要 19 分钟。那很慢吗?我怎样才能使这个计划更快?

【问题讨论】:

  • 需要一些信息来更好地帮助您:什么版本的 Postgresql?安装数据库的机器的规格是什么(RAM、处理器、时钟、它是虚拟的等等)?你有任何其他列索引吗?
  • 检查查询计划,虽然我怀疑索引是否有很大帮助,因为select无论如何都要进行全表扫描。仅供参考,这个QA可能对你的问题值得注意。
  • 操作系统:RHEL8 vCPU:6 内存:12 虚拟机 Postgres 14 不确定时钟信息...
  • not exists 有更多帮助吗?会尝试
  • @DarkCygnus 在我的问题中说我有 binary_id 索引。另一个id 是主键,因此默认索引

标签: postgresql


【解决方案1】:

制作 binary_id 的索引 在查询下面运行使 binary_id 索引

CREATE INDEX binary_id_index ON stage_instance USING btree(binary_id);

【讨论】:

  • b树效果更好吗?不是 postgres 中的默认值吗?我已经将该列编入索引
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多