如何提高此oracle sql删除查询的性能?
根据另一个表的select查询结果,我从一个表中删除了一些不需要的行如何提高此oracle sql删除查询的性能?,sql,performance,oracle,Sql,Performance,Oracle,根据另一个表的select查询结果,我从一个表中删除了一些不需要的行 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' ); 内部select查询返回77行,并在几毫秒内执行。但是
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'
);
内部select查询返回77行,并在几毫秒内执行。但是外部删除查询将永远运行8个多小时。我试图通过将delete转换为selectcount1来计算需要删除的行数,在总共6680万行中,大约有6640万行需要删除。不过,我并没有试图截断。我需要保留剩余的行
有没有其他方法可以做到这一点?通过运行pl/sql游标删除该行会更好吗?将要保留的行插入到另一个表中,然后删除现有表是否更有意义?即使有要禁用/重新创建的FK,也几乎可以肯定会更快。将要保留的行插入到另一个表中,然后删除现有表是否更有意义?即使有FKs要禁用/重新创建/等,也几乎肯定会更快。您能添加一个toBeDeleted列吗?要设置的查询不需要在构造中设置。删除标记行也应该很简单
同样,删除6700万行中99.4%的行需要一些时间。能否添加一个toBeDeleted列?要设置的查询不需要在构造中设置。删除标记行也应该很简单
同样,删除6700万行中99.4%的行需要一些时间。尝试/*+parallelfe*/。不,请尝试/*+parallelfe*/。不,我想这不是内部查询速度慢的问题。这似乎都是由于oracle回滚段和删除期间发生的重做日志。我一问汤姆就发现了这个。。然后,如果经常需要删除几乎整个表,请使用答案by。我想这不是内部查询速度慢的问题。这似乎都是由于oracle回滚段和删除期间发生的重做日志。我一问汤姆就发现了这个。。然后,如果经常需要删除几乎整个表,请使用.ya的答案,这就是我们要尝试的。也许我猜这会比尝试用游标进行批量删除更快..是的,这就是我们要尝试的。也许我猜这比用游标进行批量删除要快。。