`
20386053
  • 浏览: 432139 次
文章分类
社区版块
存档分类
最新评论

查看Oracle数据库中未绑定变量的SQL

 
阅读更多

Oracle在解析SQL语句的时候,如果在共享池中发现匹配的SQL语句,就可以避免掉解析的大部分开销。在共享池中找到匹配的SQL语句所对应的解析被称为软解析(soft parse)。如果没有找到匹配的SQL语句,则必须进行硬解析(hard parse)

硬解析不仅耗费CPU时间,在有大量会话想要同时缓存SQL语句到共享池时还会造成争用。通过使用绑定变量,可以最小化解析的代价。

1.CURSOR_SHARING参数

该参数转换SQL语句中的字面值到绑定变量。转换值提高了游标共享,且可能会影响SQL语句的执行计划。优化器是基于绑定变量的存在生成执行计划,而不是实际字面量值。

CURSOR_SHARING决定什么类型的SQL语句可以共享相同的游标。CURSOR_SHARING参数有三个值:

  • FORCE:只要有可能,字面量就会被替换为绑定变量。
  • SIMILAR:只有当替换不会影响到执行计划时,才会将字面量替换为绑定变量
  • EXACT:这是默认值。不将字面量替换为绑定变量。

注意:不推荐修改CURSOR_SHARING参数的默认值。如果实在无法修改现有应用的代码,可以通过设置CURSOR_SHARING参数来指示Oracle透明地将字面量替换为绑定变量。

2.识别没有使用绑定变量的SQL语句

利用v$sql视图的FORCE_MATCHING_SIGNATURE字段,可以识别可能从绑定变量或CURSOR_SHARING获益的SQL语句。如果SQL已使用绑定变量或者CURSOR_SHARING,则FORCE_MATCHING_SIGNATURE在对其进行标识时将给出同样的签名。换句话说,如果两个SQL语句除了字面量的值之外都是相同的,它们将拥有相同的FORCE_MATCHING_SIGNATURE,这意味着如果为他们提供了绑定变量或者CURSOR_SHARING,它们就成了完全相同的语句。

使用FORCE_MATCHING_SIGNATURE识别没有使用绑定变来的SQL语句。

with force_mathces as
(select l.force_matching_signature mathces,
max(l.sql_id || l.child_number) max_sql_child,
dense_rank() over(order by count(*) desc) ranking
from v$sql l
where l.force_matching_signature <> 0
and l.parsing_schema_name <> 'SYS'
group by l.force_matching_signature
having count(*) > 10)
select v.sql_id, v.sql_text, v.parsing_schema_name, fm.mathces, fm.ranking
from force_mathces fm, v$sql v
where fm.max_sql_child = (v.sql_id || v.child_number)
and fm.ranking <= 5
order by fm.ranking;

3.通过执行动态SQL语句获取绑定变量的好处

通过执行动态SQL语句,比较字面量和绑定参数对SQL解析的影响。

declare
v_ename emp.ename%type;
v_sal emp.sal%type;
v_sql clob;
begin

dbms_output.put_line('*********使用字面量************');
for vrt_emp in (select * from emp) loop
v_sql := 'select e.ename,e.sal from emp e where e.empno =' ||
vrt_emp.empno;
execute immediate v_sql
into v_ename, v_sql;
dbms_output.put_line(v_ename || ':' || v_sql);
end loop;

dbms_output.put_line('');
dbms_output.put_line('*********使用绑定变量************');
for vrt_emp in (select * from emp) loop
v_sql := 'select e.ename,e.sal from emp e where e.empno =:empno';
execute immediate v_sql
into v_ename, v_sql
using vrt_emp.empno;
dbms_output.put_line(v_ename || ':' || v_sql);
end loop;

end;

查询v$sql视图,比较执行结果:

SQL> select v.sql_text, v.sql_id, v.force_matching_signature
2 from v$sql v
3 where v.sql_text like 'select e.ename,e.sal from emp e where e.empno %';

SQL_TEXTSQL_ID FORCE_MATCHING_SIGNATURE
----------------------------------------------------------------------- ------------------------
select e.ename,e.sal from emp e where e.empno =7782 766syjydcn5fh 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7499 6ymy4hcb386vt 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =79343t96y707p8by7 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7902 f9pyzxf7tnuzw 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7654fvk1fzmrvjc4j 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7788gsmatg9f4jd2z 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =75664q9pzzpvvdpuu 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =73693xhqmvm5vdqy0 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7698bjjjw0gzaprzv 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =78768nd8v8mrzxw4w 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =75215tnyy066zfk1b 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7844 4kd7jb013g2zz 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =7900grx9sh4fwrcwx 1.27397653964533E19
select e.ename,e.sal from emp e where e.empno =:empno20wmyr4cvrr6k 3.49355109645567E18
select e.ename,e.sal from emp e where e.empno =78396u2ajyu05gw9s 1.27397653964533E19

在v$sql视图中,发现使用字面量的SQL语句有14条,而使用绑定变量的SQL语句只有一条。其中使用字面量的SQL语句除以了字面量值不同之外,其他部分都是相同。而FORCE_MATCHING_SIGNATURE的值是在假设该SQL语句使用绑定变量或者CURSOR_SHARING得到的,因此通过FORCE_MATCHING_SIGNATURE字段识别没有绑定变量的SQL语句。

分享到:
评论

相关推荐

    查找未使用绑定变量sql.sql

    查找未使用绑定变量sql.sql

    oracle 数据库的绑定变量特性及应用

    绑定变量的目的和命名用方法

    Oracle数据库绑定变量特性及应用

    结合实例说明Oracle数据库绑定变量特性及应用。合理的使用绑定变量,可以大大提高SQL性能

    在Java中实现Oracle变量的绑定方法 .doc

    在Java中实现Oracle变量的绑定方法 .doc 在Java中实现Oracle变量的绑定方法 .doc

    Java中Oracle操作绑定变量使用用户工具模块解决方案

    Java中Oracle操作绑定变量使用用户工具模块解决方案

    oracle 的绑定变量

    不使用绑定变量可能会使OLTP 数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢。  当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去SQL语句。Oracle 在接收到这些SQL后,会先对这个...

    基于Oracle的SQL优化 Part2

    《基于Oracle的SQL优化》从Oracle处理SQL的本质和原理入手,由浅入深、系统地介绍了Oracle数据库里的优化器、执行计划、Cursor和绑定变量、查询转换、统计信息、Hint和并行等这些与SQL优化息息相关的本质性内容,并...

    基于Oracle的SQL优化 Part1

    《基于Oracle的SQL优化》从Oracle处理SQL的本质和原理入手,由浅入深、系统地介绍了Oracle数据库里的优化器、执行计划、Cursor和绑定变量、查询转换、统计信息、Hint和并行等这些与SQL优化息息相关的本质性内容,并...

    【数据库维护】-oracle远程维护程序

    通过远程连接Oracle数据库的方式实现对数据库进行管理维护 ... 7) 获取SQL语句中绑定变量的信息。 8) 查询REDO日志切换速度。 9) 表空间自动添加数据文件(仅支持ASM)。 10) 生成SQL语句优化建议。

    Oracle11g从入门到精通

    5.2.6 使用绑定变量 5.2.7 跟踪语句 5.3 设置SQL*Plus环境 5.3.1 SHOW命令 5.3.2 SET命令 5.4 SQL*Plus环境介绍 5.4.1 存储SQL*Plus环境 5.4.2 假脱机输出 5.4.3 联机帮助 5.5 使用SQL*Plus格式化查询结果 ...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    5.3.4 RAC中的SCN 5.4本章小结 第6章 RAC的高可用性连接 6.1 Oracle Net Service 6.1.1 Oracle Net结构 6.1.2 Oracle Net命名方法 6.1.3 Oracle Net工作原理 6.1.4 Oracle Net Listener工作原理 6.1.5 JDBC...

    Oracle11g从入门到精通2

    5.2.6 使用绑定变量 5.2.7 跟踪语句 5.3 设置SQL*Plus环境 5.3.1 SHOW命令 5.3.2 SET命令 5.4 SQL*Plus环境介绍 5.4.1 存储SQL*Plus环境 5.4.2 假脱机输出 5.4.3 联机帮助 5.5 使用SQL*Plus格式化...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY...

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    PL/SQL中使用DML和DDL语言 PL/SQL中的异常 PL/SQL函数编写 第8章-游标,数据的缓存区 什么是游标 显示游标 隐式游标 第9章-视图,数据库中虚拟的表 什么是视图 视图的创建 操作视图数据的限制 视图的...

    Oracle数据库优化策略总结篇

    为了提高查询效率,我们常常做一些优化策略。本文主要介绍一些Oracle数据库的一些不常见却是非常有用的优化策略,希望能...绑定变量 这个能够大幅度减退SQL的“hard parse”,我们大局部过程都曾经告终了变量绑定。个别

    oracle SQL性能优化

    ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等; (5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 (6) ...

    精通SQL--结构化查询语言详解

    3.6.2 sql server中数据库的创建 57 3.6.3 删除数据库 58 第4章 索引与视图的创建 61 4.1 索引的基础知识 61 4.1.1 索引的概念 61 4.1.2 索引的结构 61 4.2 索引的创建与销毁 63 4.2.1 基本创建语法 63 ...

Global site tag (gtag.js) - Google Analytics