【问题标题】:Postgres SQL Optimizing Delete RangePostgresql 优化删除范围
【发布时间】:2014-07-24 08:50:26
【问题描述】:

我已经能够将删除范围从大约 3 分钟到 3-7 秒。但是,我不确定我是否遵循删除信息的理想路线。从我一直在阅读的内容来看,理想的删除方式如下:

  1. 删除所有外键限制。
  2. 删除数据。
  3. 重新添加外键约束。

但这确实有点混乱,因为我们还想删除外键内部的信息。所以我得出了以下解决方案。

  1. 删除所有外键限制。
  2. 获取所有正在删除的 id 的列表。
  3. 列表中的 Foreach id
    • 从 ID 匹配的 table1 中删除
    • 从 ID 匹配的 table2 中删除
    • 从 ID 匹配的 table3 中删除
    • 从 ID 匹配的 table4 中删除
    • 从 ID 匹配的 table5 中删除
  4. 重新添加外键约束。

似乎时间锁定正在执行 foreach 循环并从每个表中删除。在 postgres 中,有没有办法使用并行从表中删除?或者我应该尝试使用 id 组而不是单个 id 删除?

在运行删除语句之前,我还在 ID 上创建索引和聚类。

我愿意接受任何建议。

【问题讨论】:

  • 我不明白您为什么要在实际应用外键时删除它们;他们慢吗?我不明白为什么他们应该比手动执行相同的任务要慢
  • 只是为了确认:all 相关列是否已编入索引? (所有 ID 列和引用它们的列)
  • 所有相关列都已编入索引。当我在不删除外键的情况下删除时,查询执行大约需要 3-5 分钟。但是,通过手动运行它们,我能够在 3-7 秒内运行它们。不确定到底有什么区别。我可以在大约 0.07 的 SQL Server 中执行相同的查询,因为级联删除似乎更有效。
  • 在我看来,您的 Postgres 表的设置有问题,因为它不应该这么慢。您可以发布主表和子表之一的创建表脚本吗? (stackoverflow.com/a/2594564/1180785)(也可能值得尝试只使用一个子表,然后是两个子表,等等以缩小问题范围)
  • 你也一次删除一个项目吗?如果可能,请尝试使用批处理或单个语句。我不知道你是从哪种语言驱动它的,但大多数都有批处理语句的能力,通常在后台将它们转换为更高效的单个语句。

标签: postgresql


【解决方案1】:

看起来我有点过于复杂了查询。我可以通过以下步骤解决它。

  1. 为我知道将在每个表中查询的每一列创建索引。
  2. 在运行查询之前,在索引上运行集群大大缩短了时间。

我是 postgres 的新手,聚集索引与您使用 SQL Server 所使用的相似但不同。有关详细信息,请参阅 Cluster 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多