在前面的文章动态SQL不绑定变量的影响中已经说明了不绑定变量SQL的负面影响,这篇文章中,我们将介绍如何查找出ORACLE数据库中的那些不绑定变量的SQL。
1. 非绑定变量的SQL语句查询
SELECT to_char(FORCE_MATCHING_SIGNATURE), COUNT (1)
FROM v$sql
WHERE FORCE_MATCHING_SIGNATURE > 0
AND FORCE_MATCHING_SIGNATURE != EXACT_MATCHING_SIGNATURE
GROUP BY FORCE_MATCHING_SIGNATURE
HAVING (COUNT (1) > &a) --FORCE_MATCHING_SIGNATURE的计数,20
ORDER BY 2 desc;
一般变量a可以输入20,如果查不到就说明数据库没有严重的不绑定变量SQL。
查询结果里计数值越大,说明相应SQL出现的频率越高,问题越严重。
![20d5bfa1fd686290c2d0f69306599ac9.png](https://i-blog.csdnimg.cn/blog_migrate/69bd1e6613d096819a6ec003882a1c6c.jpeg)
比如上图中第一条,FORCE_MATCHING_SIGNATURE为7688923598894398991,数量达到了16597。
2. 根据FORCE_MATCHING_SIGNATURE查看SQL
select sql_id,sql_fulltext
from v$sqlarea
where force_matching_signature = &FORCE_MATCHING_SIGNATURE;--参数在上一步查出
![1ec9fce989bd0cfd4fdc9cdeb059114d.png](https://i-blog.csdnimg.cn/blog_migrate/5f89d6a0621ca7a26772343bbf4c2dc0.jpeg)
然后点开结果中的SQL_FULLTEXT就可以看到有问题的SQL,一般会看如下SQL,SQL内容基本都一样,只是参数不一样:
SELECT REPORT_NUMBER FROM REPORT_HEADERS R WHERE HEADER_ID = 1178851
SELECT REPORT_NUMBER FROM REPORT_HEADERS R WHERE HEADER_ID = 1178852
这就是需要优化的SQL了,需要使用绑定变量的方法来进行调用。一般这时就要进一步定位这些SQL是在java代码里,还是存储过程或者包里的。
3.1根据SQL内容在包里查找
select * from user_source
where type='PACKAGE BODY'
AND lower(text) like'%'||lower('&SQL_PART')||'%' ;
查找时SQL_PART参数可以输入“REPORT_HEADERS R”
![91f3b6b48d8c7172728f4e96643b2ceb.png](https://i-blog.csdnimg.cn/blog_migrate/97bc94776573dc35a15dbc9d105edc09.jpeg)
3.2根据SQL内容在存储过程中查找
select * from user_source
where type='PROCEDURE'
AND lower(text) like'%'||lower('&SQL_PART')||'%' ;
3.3根据SQL内容在JAVA代码中查找
这个就直接使用java代码的搜索功能去查找了。
不绑定变量的SQL定位到以后,就可以根据具体情况进行分析优化解决了。