oracle 删除语句的性能/解释计划

vsnjm48y  于 2023-04-11  发布在  Oracle
关注(0)|答案(1)|浏览(164)

由于解释计划未显示成本/基数(仅显示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;

0x6upsns

0x6upsns1#

你不能从PL/SQL块中生成计划。你只能对SQL这样做。所以,把这些DELETE语句中的每一个都拉出来,用绑定变量占位符替换任何PL/SQL变量:

EXPLAIN PLAN FOR
DELETE FROM table1 t1
  WHERE t1.ftcode = :FTCode
/
SELECT * FROM TABLE(dbms_xplan.display())
/

EXPLAIN PLAN FOR
DELETE FROM table2 t2
    WHERE t2. ftcodet2 = :FTCode;
/
SELECT * FROM TABLE(dbms_xplan.display())
/

注意:符号。这将使它成为一个绑定变量(尽管实际上还没有绑定值)。这足以获得一个执行计划。
现在请注意,在启用绑定窥视的情况下,数据倾斜和直方图很大,Oracle可能会因绑定变量值本身而生成多个子游标,这可能会导致不同的计划,具体取决于您绑定的值。所以有时您可能希望尝试文字:

EXPLAIN PLAN FOR
DELETE FROM table1 t1
  WHERE t1.ftcode = 1234
/
SELECT * FROM TABLE(dbms_xplan.display())
/

查看它是否会对计划产生影响。即使这样也不能保证你的代码会这样做,因为文字可能会导致与绑定变量不同的计划。绝对确定使用什么计划的唯一方法是实际观察它。这将需要SELECT ANY DICTIONARY权限和一些关于如何导航v$sessionv$active_session_historyv$sqlv$sql_plan的知识,我将停止任何进一步的讨论,不要延长这篇文章。
还有一点很重要:当你看一个计划时,学会阅读它,了解每一步在做什么,每一步的执行次数和每一步的行数。不要看COST。这是一个浪费的信息,Oracle永远不应该暴露。根据定义,Oracle将通过计算选择成本最低的计划。如果它犯了一个错误,那么它计算的成本是不正确的,这个数字是伪造的。因此,对于性能调优来说,对这个数字给予丝毫的关注是毫无意义的。你必须了解如何阅读计划,了解Oracle如何进行表访问、联接、排序等。除了了解你的数据关系外,基数和体积,以便知道它是否选择了正确的计划。

相关问题