postgresql – 如何从频繁访问的表中删除许多行

postgresql – 如何从频繁访问的表中删除许多行,第1张

概述我需要删除一个非常大的表(例如,5米行)的大多数(比方说,90%).该表的另外10%经常被读取,但不写入. 从“Best way to delete millions of rows by ID”开始,我收集到我应该删除90%我正在删除的任何索引,以加快进程(除了我用来选择要删除的行的索引). 从“PostgreSQL locking mode”开始,我看到此 *** 作将在整个表上获得ROW EXCLU 我需要删除一个非常大的表(例如,5米行)的大多数(比方说,90%).该表的另外10%经常被读取,但不写入.

从“Best way to delete millions of rows by ID”开始,我收集到我应该删除90%我正在删除的任何索引,以加快进程(除了我用来选择要删除的行的索引).

从“PostgreSQL locking mode”开始,我看到此 *** 作将在整个表上获得ROW EXCLUSIVE锁.但由于我只读了其他10%,这应该不重要.

那么,在一个命令中删除所有内容是否安全(即DELETE FROM表WHERE delete_flag =’t’)?我担心如果删除一行失败,触发大量回滚,那么它将影响我从表中读取的能力.批量删除会更明智吗?

解决方法 >索引对于所有行的90%的 *** 作完全没用.无论哪种方式,顺序扫描都会更快.
>如果需要允许并发读取,则不能对表进行独占锁定.因此,您也不能删除同一事务中的任何索引.
>您可以在单独的事务中删除索引,以使独占锁的持续时间保持最短.
然后使用CREATE INDEX CONCURRENTLY在后台重建索引 – 并且只采用非常简短的独占锁.

如果你有一个稳定的条件来识别剩余的10%的行,我强烈建议在这些行上使用partial index以获得最佳效果:

>读取查询可以随时快速访问表(使用部分索引).
>大DELETE根本不会修改部分索引,因为DELETE中没有涉及任何行.

CREATE INDEX foo (some_ID) WHERE delete_flag = FALSE;

假设delete_flag是布尔值.您必须在查询中包含相同的谓词(即使它看起来在逻辑上是多余的),以确保Postgres理解它可以使用部分索引.

总结

以上是内存溢出为你收集整理的postgresql – 如何从频繁访问的表中删除许多行全部内容,希望文章能够帮你解决postgresql – 如何从频繁访问的表中删除许多行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160937.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存