首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgres 9超级慢简单删除

Postgres 9超级慢简单删除
EN

Stack Overflow用户
提问于 2011-10-24 08:59:28
回答 2查看 10.7K关注 0票数 9

我有一个庞大的数据库..。不是很大的一个

我需要从几个表中删除一些行。例如我有一张桌子

代码语言:javascript
运行
复制
 Order
 id     | ... | status   | ...
 1      | ... | 1        | ...
 ...
 40     | ... | 20       | ...
 41     | ... | 1        | ...
 ...
 470000 | ... | 12       | ...

现在我想删除所有有status=1的订单

我想我是用:

从status=1顺序中删除

所有的美好和简单,它看起来,但它需要很长时间!当我运行这个查询时,它在40分钟后仍然以100%的CPU使用率运行。当我杀死这个过程时,没有任何东西被删除。

当我试图通过使用

从status=1和id<1000的顺序中删除

删除大约200行花了几分钟.

我的配置中有遗漏什么吗?我有什么要找的吗?有什么想法吗?为什么这么低效率?

让我补充一下,我通常使用MySQL,需要管理postgres数据库,但实际上没有使用postgres的经验,所以这可能是非常简单的事情。

索引在id列和状态列上。

表有大约500 K行,大约有一半需要删除。

执行计划:

代码语言:javascript
运行
复制
Delete  (cost=0.00..19474.19 rows=266518 width=6)
->  Seq Scan on Orders  (cost=0.00..19474.19 rows=266518 width=6)
Filter: (statusid = 1)

没有任何触发或规则。更重要的是,我没有添加这是表的新副本,我的意思是它是从其他带有导出/导入的服务器上移动的。也许这在某种程度上起到了作用?

删除索引有帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-24 18:06:09

在你杀死这个过程之后,没有任何东西被删除,这正是你应该看到的。

删除以事务的形式进行,意味着所有内容都被删除了,或者什么都没有删除。为了确保这种情况能够发生,在删除行之前,需要在某个地方复制行。这意味着删除250 k行所需的时间与插入该多行所需的时间相同。在某些情况下,可以更快地创建一个没有删除所有内容的新表,并将新表重命名为旧表。

如果这是从另一个db移动,您可能会更好,如果您可以防止250 k行被插入的第一。

(这是一般的RDBMS智慧,而不是postgresql特有的- postgres MVCC的工作细节可能有很大的不同。)

票数 10
EN

Stack Overflow用户

发布于 2015-04-24 11:14:18

从/ TURNCATE /COPY复制到大表上要快得多。

但是,当然,您必须小心引用,如果可能的话,禁用触发器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7873253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档