专栏/知行者/ 文章详情 /

如何查看存储过程/函数中的sql语句的执行计划

一抹夏忧 2021/12/09 3806 4 0
摘要 存储过程 函数 执行计划

背景:存储过程或者是函数中,如何查看语句块中sql的执行计划?

操作:
1、创建测试表
create table ttest1(a int,b varchar);
insert into ttest1 values(1,‘haha’),(2,‘haha’);
commit;
create table ttest2(a int,b varchar);

2、创建测试存储过程
create or replace PROCEDURE ptest1(v1 int,v2 varchar)
as
BEGIN
select a.* from ttest1 a INNER join ttest2 b on a.a=b.a where a.a=V1;
select a.* from ttest1 a INNER join ttest2 b on a.a=b.a where a.B=V2;
select a.* from ttest1 a INNER join ttest2 b on a.a=b.a where (a.a=V1 or a.B=V2);
end;

3、调用过程,导出plndump
call ptest1(1,‘haha’);

4、根据执行计划缓存信息,获取cache_item
select cache_item,sqlstr from v$cachepln where sqlstr like ‘%ptest1%’;

5、根据步骤4获取的cache_item导出plndump
ALTER SESSION SET EVENTS ‘IMMEDIATE TRACE NAME PLNDUMP,LEVEL 140015356688432’;
–执行完成后,会在DAMENG目录的trace目录下生成一个trc文件,打开该文件,找到另一个不一样的cache_item号
–例如sub_method[1] :: PLN[140163083606064][PTEST1]

6、再次执行trace命令,后面的cache_item换成从步骤5trace文件中看到的cache_item,例如上面的:PLN[140015356745776]
ALTER SESSION SET EVENTS ‘IMMEDIATE TRACE NAME PLNDUMP,LEVEL 140015356745776’;
–执行完成后,会把ptest1存储的计划追加到trc文件后面,可以看到每条sql语句对于的计划
–其中sqlnode0,1,2分别对应存储中写的3条语句,这样就方便查看每条sql的计划。

7、trace文件中sql语句的计划展示:
16390371661.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服