我有一个庞大的数据库..。不是很大的一个
我需要从几个表中删除一些行。例如我有一张桌子
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行,大约有一半需要删除。
执行计划:
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)
没有任何触发或规则。更重要的是,我没有添加这是表的新副本,我的意思是它是从其他带有导出/导入的服务器上移动的。也许这在某种程度上起到了作用?
删除索引有帮助吗?
发布于 2011-10-24 18:06:09
在你杀死这个过程之后,没有任何东西被删除,这正是你应该看到的。
删除以事务的形式进行,意味着所有内容都被删除了,或者什么都没有删除。为了确保这种情况能够发生,在删除行之前,需要在某个地方复制行。这意味着删除250 k行所需的时间与插入该多行所需的时间相同。在某些情况下,可以更快地创建一个没有删除所有内容的新表,并将新表重命名为旧表。
如果这是从另一个db移动,您可能会更好,如果您可以防止250 k行被插入的第一。
(这是一般的RDBMS智慧,而不是postgresql特有的- postgres MVCC的工作细节可能有很大的不同。)
发布于 2015-04-24 11:14:18
从/ TURNCATE /COPY复制到大表上要快得多。
但是,当然,您必须小心引用,如果可能的话,禁用触发器。
https://stackoverflow.com/questions/7873253
复制相似问题