由于解释计划未显示成本/基数(仅显示select语句),如何检查删除语句的性能计划
或者是否有其他方法来检查Oracle中delete语句的性能?
使用Where exists检查删除
DECLARE FTCode VARCHAR(20):= 'XI-9873';开始DELETE FROM t1 WHERE EXISTS(select 1 from t1 Where t1.ftcode = FTCode);
DELETE FROM table2 t2
WHERE EXISTS (select 1 from t2 Where t2.ftcodet2 = FTCode) ;
END;
使用Count(*)删除
DECLARE FTCode VARCHAR(20):= 'XI-9873';FT_COUNT NUMBER:= 0;开始SELECT COUNT(*)INTO FT_COUNT FROM table1 t1 WHERE t1.ftcode = FTCode;
IF FT_COUNT > 0
THEN
DELETE FROM table1 t1
WHERE t1.ftcode = FTCode;
END IF;
FT_COUNT := 0;
SELECT COUNT (*)
INTO FT_COUNT
FROM table2 t2
WHERE t2. ftcodet2 = FTCode;
IF FT_COUNT > 0
THEN
DELETE FROM table2 t2
WHERE t2. ftcodet2 = FTCode;
END IF;
END;
1条答案
按热度按时间0x6upsns1#
你不能从PL/SQL块中生成计划。你只能对SQL这样做。所以,把这些DELETE语句中的每一个都拉出来,用绑定变量占位符替换任何PL/SQL变量:
注意
:
符号。这将使它成为一个绑定变量(尽管实际上还没有绑定值)。这足以获得一个执行计划。现在请注意,在启用绑定窥视的情况下,数据倾斜和直方图很大,Oracle可能会因绑定变量值本身而生成多个子游标,这可能会导致不同的计划,具体取决于您绑定的值。所以有时您可能希望尝试文字:
查看它是否会对计划产生影响。即使这样也不能保证你的代码会这样做,因为文字可能会导致与绑定变量不同的计划。绝对确定使用什么计划的唯一方法是实际观察它。这将需要
SELECT ANY DICTIONARY
权限和一些关于如何导航v$session
、v$active_session_history
、v$sql
和v$sql_plan
的知识,我将停止任何进一步的讨论,不要延长这篇文章。还有一点很重要:当你看一个计划时,学会阅读它,了解每一步在做什么,每一步的执行次数和每一步的行数。不要看
COST
。这是一个浪费的信息,Oracle永远不应该暴露。根据定义,Oracle将通过计算选择成本最低的计划。如果它犯了一个错误,那么它计算的成本是不正确的,这个数字是伪造的。因此,对于性能调优来说,对这个数字给予丝毫的关注是毫无意义的。你必须了解如何阅读计划,了解Oracle如何进行表访问、联接、排序等。除了了解你的数据关系外,基数和体积,以便知道它是否选择了正确的计划。