开发告诉你一个sql慢,你想看看缓存中执行计划时,怎么精准快速定位?
可能一般人通过文本内容模糊搜索
select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like '%YOUR SQL STRING%';
搜出来的内容比较多,研究一下执行计划缓存表
要快一点的技巧是增加几个条件,如:执行用户、表数量、列数量(最外层)
加上些已知条件剩余的就少了一些
select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like '%from t1%' and n_table=1 and n_cols=1;
定位到想要的sql后,下一步看看缓存的执行计划
alter session set events 'immediate trace name plndump level &id, dump_file ''/home/dmdba/dump_plan_&id..log''';
看输出内容 cat dump_plan_140726259863656.log
与实际的计划比较
一样一样的。
不一样怎么办?
有可能(我是说有可能)通过jdbc执行走旧的执行计划,而通过disql执行走新的执行计划。
方法一:通常是清理掉缓存中的计划
call sp_clear_plan_cache(pln号);---不加 pln 就是清理所有 sql 缓存
清理后会重新生成。
方法二:还可以通过对表加注释comment,触发ddl使得重新生成执行计划(有点儿眼熟)
方法三:实在不行就重启实例。