利用REMOVE_CONSTANTS函数,查询共享池中哪些SQL没有绑定变量
2013-11-08 23:34
267 查看
首先创建一个表,用于存放整理过的数据:
SQL> create table t1 as select sql_text from v$sqlarea;
Table created
给表t1增加一个字段:
SQL> alter table t1 add sql_text_wo_constants varchar2(1000);
Table altered
创建函数remove_constants;
将v$sql视图中的数据用remove_constants处理后,更新到t1表中:
SQL> update t1 set sql_text_wo_constants = remove_constants(sql_text);
239 rows updated
查出除了谓语条件不同的sql语句和他们的执行次数,在这里是查询sql没有被重用超过100次的sql语句:
SQL> select sql_text_wo_constants,count(*) from t1 group by sql_text_wo_constants having count(*) > 100 order by 2;
-----------------------------------------------------------------------------------
以下是一个测试的例子,我们使用一个循环执行1000次某条SQL,每次执行只是谓语不用(即不用绑定变量)
SQL> create table t as select rownum rm from dba_objects;
循环1000次这个sql
begin
for i in 1..1000 loop
execute immediate 'select * from t where rm='||i;
end loop;
end;
SQL> create table t1 as select sql_text from v$sqlarea;
Table created
SQL> alter table t1 add sql_text_wo_constants varchar2(1000);
Table altered
SQL> update t1 set sql_text_wo_constants = remove_constants(sql_text);
372 rows updated
SQL> select sql_text_wo_constants,count(*) from t1 group by sql_text_wo_constants having count(*) > 100 order by 2;
SQL_TEXT_WO_CONSTANTS COUNT(*)
-------------------------------------------------------------------------------- ----------
SELECT * FROM T WHERE RM=@ 146
不知道为什么我查出来不是1000次......
**你可以去清一下shared_pool(alter system flush shared_pool)再去做这个实验
SQL> create table t1 as select sql_text from v$sqlarea;
Table created
给表t1增加一个字段:
SQL> alter table t1 add sql_text_wo_constants varchar2(1000);
Table altered
创建函数remove_constants;
create or replace function remove_constants( p_query in varchar2 ) return varchar2 as l_query long; l_char varchar2(1); l_in_quotes boolean default FALSE; begin for i in 1 .. length( p_query ) loop l_char := substr(p_query,i,1); if ( l_char = '''' and l_in_quotes ) then l_in_quotes := FALSE; elsif ( l_char = '''' and NOT l_in_quotes ) then l_in_quotes := TRUE; l_query := l_query || '''#'; end if; if ( NOT l_in_quotes ) then l_query := l_query || l_char; end if; end loop; l_query := translate( l_query, '0123456789', '@@@@@@@@@@' ); for i in 0 .. 8 loop l_query := replace( l_query, lpad('@',10-i,'@'), '@' ); l_query := replace( l_query, lpad(' ',10-i,' '), ' ' ); end loop; return upper(l_query); end;
将v$sql视图中的数据用remove_constants处理后,更新到t1表中:
SQL> update t1 set sql_text_wo_constants = remove_constants(sql_text);
239 rows updated
查出除了谓语条件不同的sql语句和他们的执行次数,在这里是查询sql没有被重用超过100次的sql语句:
SQL> select sql_text_wo_constants,count(*) from t1 group by sql_text_wo_constants having count(*) > 100 order by 2;
-----------------------------------------------------------------------------------
以下是一个测试的例子,我们使用一个循环执行1000次某条SQL,每次执行只是谓语不用(即不用绑定变量)
SQL> create table t as select rownum rm from dba_objects;
循环1000次这个sql
begin
for i in 1..1000 loop
execute immediate 'select * from t where rm='||i;
end loop;
end;
SQL> create table t1 as select sql_text from v$sqlarea;
Table created
SQL> alter table t1 add sql_text_wo_constants varchar2(1000);
Table altered
SQL> update t1 set sql_text_wo_constants = remove_constants(sql_text);
372 rows updated
SQL> select sql_text_wo_constants,count(*) from t1 group by sql_text_wo_constants having count(*) > 100 order by 2;
SQL_TEXT_WO_CONSTANTS COUNT(*)
-------------------------------------------------------------------------------- ----------
SELECT * FROM T WHERE RM=@ 146
不知道为什么我查出来不是1000次......
**你可以去清一下shared_pool(alter system flush shared_pool)再去做这个实验
相关文章推荐
- 确定系统中是否存在绑定变量的情况,ASKTOM提供函数remove_constans()来检查共享池中的SQL运行情况
- 如何查看共享池中哪些sql没有绑定变量--from ask tom
- MySQL利用profile分析慢sql详解(group left join效率高于子查询)
- 关于《一个SQL语句查询问题(查询最小值)(急)》回复里面没有正确理想的答案!
- Script:利用外部表实现SQL查询Oracle告警日志Alert.log
- ORACLE OEM简介(如何利用OEM查看oracle当前在执行哪些SQL语句)
- SQLServer中用T—SQL命令查询一个数据库中有哪些表的sql语句
- SQL查询出表中某列含有重复数据和没有重复数据的值
- SQL语句之利用UNION查询生成报表
- sql多变量条件查询,变量条件可能为全部都符合。利用1=1做字符串连接查询
- Mybatis程序中执行和单独执行同一条SQL出现结果不一致(部分数据没有查询出来)
- mybatis查询的时候xml文件中没有对应的sql映射文件
- Oracle sql"NOT IN"语句优化,查询A表有、B表没有的数据
- Scripts:查询没有统计信息的对象perf_objects_without_statistics.sql
- 利用SQL Profiler处理开销较大的查询
- 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;
- SqlServer 查询对数据库执行了哪些SQL
- [导入]利用Attribute特性简化多查询条件拼接sql语句的麻烦
- SQLServer如何用T—SQL命令查询一个数据库中有哪些表
- OpenJPA查询生成的SQL语句,为何Or后面没有括号