[英]how can i improve the performance of this oracle sql delete query?
我必须根据另一个表中的选择查询结果从表中删除一些不需要的行
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游标删除它会更好?
仅将要保留的行插入另一个表,然后删除现有表,是否更有意义? 即使有FK禁用/重新创建/等。 几乎可以肯定会更快。
您可以添加“ toBeDeleted”列吗? 设置不需要“ NOT IN”构造的查询。 删除标记的行也应该是“简单的”。
然后,再次删除6700万行中的99.4%将需要一些时间。
尝试/ * + parallel(fe)* /。 没有“ S”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.