背景:存储过程或者是函数中,如何查看语句块中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语句的计划展示:
文章
阅读量
获赞