【发布时间】:2016-05-13 08:24:14
【问题描述】:
我需要删除一个非常大的表(比如 5m 行)的大部分(比如 90%)。该表的另外 10% 经常被读取,但不被写入。
从“Best way to delete millions of rows by ID”中,我得知我应该删除我要删除的 90% 上的任何索引,以加快进程(除了我用来选择要删除的行的索引)。
从“PostgreSQL locking mode”中,我看到这个操作会在整个表上获得一个ROW EXCLUSIVE 锁。但既然我只是阅读剩下的 10%,这应该没关系。
那么,在一个命令中删除所有内容是否安全(即DELETE FROM table WHERE delete_flag='t')?我担心如果删除一行失败,触发 巨大 回滚,那么它会影响我从表中读取的能力。批量删除会不会更明智?
【问题讨论】:
-
先给个小建议:不管做什么,先备份数据库,然后处理到删除DELETE FROM table WHERE delete_flag='t'
-
与 Oracle 不同,
rollback在 Postgres 中实际上相当便宜 -
要添加到@a_horse_with_no_name 的评论中:“实际上很便宜”意味着 PostgreSQL 在回滚的情况下甚至不会触及您的表。只需将交易标记为这样。 O(1) 使用大 O 表示法。
标签: postgresql indexing transactions locking postgresql-performance