【发布时间】:2014-07-24 08:50:26
【问题描述】:
我已经能够将删除范围从大约 3 分钟到 3-7 秒。但是,我不确定我是否遵循删除信息的理想路线。从我一直在阅读的内容来看,理想的删除方式如下:
- 删除所有外键限制。
- 删除数据。
- 重新添加外键约束。
但这确实有点混乱,因为我们还想删除外键内部的信息。所以我得出了以下解决方案。
- 删除所有外键限制。
- 获取所有正在删除的 id 的列表。
- 列表中的 Foreach id
- 从 ID 匹配的 table1 中删除
- 从 ID 匹配的 table2 中删除
- 从 ID 匹配的 table3 中删除
- 从 ID 匹配的 table4 中删除
- 从 ID 匹配的 table5 中删除
- 重新添加外键约束。
似乎时间锁定正在执行 foreach 循环并从每个表中删除。在 postgres 中,有没有办法使用并行从表中删除?或者我应该尝试使用 id 组而不是单个 id 删除?
在运行删除语句之前,我还在 ID 上创建索引和聚类。
我愿意接受任何建议。
【问题讨论】:
-
我不明白您为什么要在实际应用外键时删除它们;他们慢吗?我不明白为什么他们应该比手动执行相同的任务要慢
-
只是为了确认:all 相关列是否已编入索引? (所有 ID 列和引用它们的列)
-
所有相关列都已编入索引。当我在不删除外键的情况下删除时,查询执行大约需要 3-5 分钟。但是,通过手动运行它们,我能够在 3-7 秒内运行它们。不确定到底有什么区别。我可以在大约 0.07 的 SQL Server 中执行相同的查询,因为级联删除似乎更有效。
-
在我看来,您的 Postgres 表的设置有问题,因为它不应该这么慢。您可以发布主表和子表之一的创建表脚本吗? (stackoverflow.com/a/2594564/1180785)(也可能值得尝试只使用一个子表,然后是两个子表,等等以缩小问题范围)
-
你也一次删除一个项目吗?如果可能,请尝试使用批处理或单个语句。我不知道你是从哪种语言驱动它的,但大多数都有批处理语句的能力,通常在后台将它们转换为更高效的单个语句。
标签: postgresql