我怎样才能提高这个oracle sql删除查询的性能?

时间:2012-03-12 16:04:55

标签: sql performance oracle

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

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小时)。我试图通过将删除转换为select count(1)以及其总共6680万行中的6640万个fact_x行来计算要删除的行数。我不是试图截断。我需要保留剩下的行。

还有其他方法可以达到这个目的吗?通过运行pl / sql游标来删除它会更好吗?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

尝试/ * + parallel(fe)* /。没有“S”。