【问题标题】:how can i improve the performance of this oracle sql delete query?如何提高这个 oracle sql 删除查询的性能?
【发布时间】:2012-03-29 01:23:18
【问题描述】:

我必须根据从另一个表中选择查询的结果从一个表中删除一些不需要的行

DELETE /*+ parallels(fe) */  FROM fact_x fe
WHERE fe.key NOT IN(
  SELECT DISTINCT di.key
  FROM dim_x di
  JOIN fact_y fa
  ON fa.code         = di.code
  WHERE fa.code_type = 'ABC'
 );

内部选择查询返回 77 行并在几毫秒内执行。但外部删除查询永远运行(超过 8 小时)。我试图通过将 delete 转换为 select count(1) 来计算要删除的行数,它在总共 6680 万行中约有 6640 万行 fact_x 行。我并不想截断。我需要保留剩余的行。

还有其他方法可以实现吗?通过运行 pl/sql 游标删除它会更好吗?

【问题讨论】:

    标签: sql performance oracle


    【解决方案1】:

    将要保留的行插入另一个表,然后删除现有表不是更有意义吗?即使有要禁用/重新创建/等的 FK。它几乎肯定会更快。

    【讨论】:

    • 是的,这就是要尝试的。可能我猜这会比尝试使用游标进行批量删除要快..
    【解决方案2】:

    您能添加一个“toBeDeleted”列吗?要设置的查询不需要“NOT IN”构造。删除标记的行也应该是“简单的”。

    再一次,删除 6700 万行中的 99.4% 需要一些时间。

    【讨论】:

    • 我猜这不是内部查询缓慢的问题。这似乎都是由于删除期间发生的 oracle 回滚段和重做日志内容。我在问汤姆时遇到了这个。asktom.oracle.com/pls/asktom/…
    • 那么如果经常需要删除几乎整个表,请使用JNK的答案。
    【解决方案3】:

    试试 /*+ 并行(fe) */。没有“S”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多