oracle select 变量_详解oracle数据库优化参数--cursor_sharing
概述
大家都知道硬解析,软解析对数据库sql的执行效率影响是很大的。在Oracle中,用户输入的SQL语句要进行所谓的Parse解析过程,用于生成执行计划,这也就是Query Optimizer的主要工作。在Parse中,有两种具体类型,被称为“hard parse”(硬解析)和“Soft parse”(软解析)。
“实现执行计划shared cursor共享,减少硬解析”是我们OLTP系统优化一个重要方向。但是,让Oracle真正实现SQL共享不是一件容易的事情,受到很多其他因素的影响。最常用的方式是使用绑定变量,让SQL字面值保持一致。如果应用端没有使用绑定变量,其中一种做法是设置系统参数cursor_sharing,将SQL语句中的条件进行绑定变量替换。
一、Cursor_sharing简介:
这个参数是用来告诉Oracle在什么情况下可以共享游标,即SQL重用。
Cursor_sharing参数有3个值可以设置:
1)、EXACT:通常来说,exact值是Oracle推荐的,也是默认的,它要求SQL语句在完全相同时才会重用,否则会被重新执行硬解析操作。
2)、SIMILAR:similar是在Oracle认为某条SQL语句的谓词条件可能会影响到它的执行计划时,才会被重新分析,否则将重用SQL。
3)、FORCE:force是在任何情况下,无条件重用SQL。
备注:上面所说的SQL重用,仅仅是指谓词条件不同的SQL语句,实际上这样的SQL基本上都在执行同样的业务操作。
二、在Cursor_sharing参数值不同时对SQL的影响:
1、创建实验环境:
----首先创建一张hwb表---- SQL> create table hwb (id int,name varchar2(10)); ----产生一些数据---- SQL> insert into hwb values(1,'aa'); SQL> insert into hwb values(2,'bb'); SQL> insert into hwb values(3,'cc'); SQL> insert into hwb values(4,'dd'); SQL> commit; SQL> select * from hwb;
----创建下面实验将要用到的三张表---- SQL> create table hwb_exact as select * from hwb; SQL> create table hwb_similar as select * from hwb; SQL> create table hwb_force as select * from hwb; ----查看该session的trace文件的路径---- SQL> oradebug setmypid SQL> oradebug tracefile_name/u01/app/oracle/diag/rdbms/nwppdb/nwppdb/trace/nwppdb_ora_3553.trc
2、 cursor_sharing=exact的情况:
----将cursor_sharing设置为exact---- SQL> alter session set cursor_sharing=exact; SQL> alter session set sql_trace=true; SQL> select * from hwb_exact where id=1; SQL> select * from hwb_exact where id=3; SQL> select * from hwb_exact where id=1; SQL> alter session set sql_trace=false;
----从下面的查询可以看出执行了两次硬解析---- SQL> select sql_text from v$sql where sql_text like 'select * from hwb_exact where%';
----查看trace文件,通过tkprof工具[oracle@nwppdb:/u01/app/oracle/diag/rdbms/nwppdb/nwppdb/trace]$tkprof nwppdb_ora_3553.trc nwppdb_ora_3553.txt aggregate内容比较多,就不介绍了,这里可以通过输出文件看到有两次硬解析一次软解析
总结:当cursor_sharing=exact时,只有当SQL语句是完全一样的情况下才能被重用。
3、 cursor_sharing=similar的情况:
----将curor_sharing设置为similar----SQL> oradebug setmypidStatement processed.SQL> oradebug tracefile_name/u01/app/oracle/diag/rdbms/nwppdb/nwppdb/trace/nwppdb_ora_3671.trcSQL> alter session set cursor_sharing=similar;SQL> alter session set sql_trace=true;SQL> select * from hwb_similar where id=1;SQL> select * from hwb_similar where id=4;SQL> select * from hwb_similar where id=8;
---下面查询中可以看到Oracle将SQL中的谓词条件用同一个名词的一个变量替代,尽管看起来是一样的,但是Oracle依然把它们作为两条SQL来处理---- SQL> select sql_text from v$sql where sql_text like 'select * from hwb_similar where%'; SQL> alter session set sql_trace=false;[oracle@nwppdb:/]$tkprof /u01/app/oracle/diag/rdbms/nwppdb/nwppdb/trace/nwppdb_ora_3671.trc /home/oracle/nwppdb_ora_3671.txt sys=no
从trace文件中可以清楚看到上面的结论----
对于SIMILAR的情况,如果CBO发现被绑定变量的谓词还有其他的执行计划可以选择时,如果谓词条件的值有变化,就将会产生一个新的子游标,而不是重用之前的SQL;如果谓词没有其他的执行计划可选择,则忽略谓词的值,重用之前的SQL。
4、 cursor_sharing=force的情况
----设置cursor_sharing=force---- SQL> alter session set cursor_sharing=force; SQL> alter session set sql_trace=true; SQL> select * from hwb_force where id=1; SQL> select * from hwb_force where id=4; SQL> select * from hwb_force where id=1; SQL> alter session set sql_trace=false;
----从下面的查询中可以看出只进行了一次硬解析,而且使用了绑定变量---- SQL> select sql_text from v$sql where sql_text like 'select * from hwb_force where%'; ----查看trace文件内容----[oracle@nwppdb:/home/oracle]$tkprof /u01/app/oracle/diag/rdbms/nwppdb/nwppdb/trace/nwppdb_ora_3697.trc /home/oracle/nwppdb_ora_3697.txt aggregate=no sys=no
总结:force是在任何情况下,无条件重用SQL。
总结:
FORCE和SIMIALR最大的区别在于,FORCE会把所有的谓词用变量代替,并且不管变量的值如何,一律重用第一条SQL语句,而SIMILAR会根据谓词的不同,来重新选择SQL的执行计划。
如果一个系统,它存在变量绑定的问题,并且这种问题已经影响到了系统的性能,这时候可以考虑将参数cursor_sharing的值设置为SIMILAR或FORCE来改善这种局面,不过在改成SIMILAR或FORCE都可能带来一些Bug以及很多未知的东西,所以需要慎用。
最后,对于OLTP系统,如果绑定变量情况不好的话,也许可以考虑通过设置这个参数来缓解一下问题;对于是在OLAP系统上,这个参数应该设置成EXACT,并且不应该使用绑定变量,因为在OLAP系统中,SQL的解析对于SQL的执行来看,花费的代价几乎可以忽略,而正确的SQL执行计划才是OLAP数据库最需要关注的。
oracle select 变量_详解oracle数据库优化参数--cursor_sharing相关推荐
- 11g oracle xe启动_详解Oracle等待事件的分类、发现及优化
一.等待事件由来 大家可能有些奇怪,为什么说等待事件,先谈到了指标体系.其实,正是因为指标体系的发展,才导致等待事件的引入.总结一下,Oracle的指标体系,大致经历了下面三个阶段: 以命中率为主要参 ...
- oracle中调试存储过程,详解Oracle调试存储过程
详解Oracle调试存储过程 一 调试关键步骤 1.在要调试的存储过程右键,选择编辑以进行调试,截图如下: 2.点击小瓢虫,弹出调试窗口,截图如下: 3.输入7839员工编号,点击确认,进行调试,截图 ...
- oracle dg切换步骤,详解Oracle dg 三种模式切换
oracle dg 三大模式切换 =================================== 1 最大性能模式MAXIMUM PERFORMANCE ------默认模式 ===== ...
- python函数中可变参数的传递方式是_详解Python函数可变参数定义及其参数传递方式...
Python函数可变参数定义及其参数传递方式详解 python中 函数不定参数的定义形式如下 1. func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): ...
- isight参数优化理论与实例详解_详解oracle数据库优化参数--cursor_sharing
概述 大家都知道硬解析,软解析对数据库sql的执行效率影响是很大的.在Oracle中,用户输入的SQL语句要进行所谓的Parse解析过程,用于生成执行计划,这也就是Query Optimizer的主要 ...
- 创建数据库_详解Oracle数据库物化视图及创建物化视图索引
概述 物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图S ...
- oracle中imp命令详解,ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP命令详细对照...
ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP 命令详细对比 一.EXPDP IMPDP EXP IMP 可以实现 1.可以实现逻辑备份和逻辑恢复 2.可以在数据库用户之间 ...
- python脚本设置环境变量_详解如何设置Python环境变量?
家好,我是Yivies!相信大家多多少少遇到过这样的情况吧?就是在安装了python之后想完整在命令提示符直接输入python就可以使用的操作,但是会出现输入了python之后找不到命令的情况!例如这 ...
- mysql 编辑数据库内容_详解mysql数据库增删改操作
插入数据 insert into 表名(列名1,列名2,列名3) values(值1,值2,值3); insert into user(user_id,name,age) values(1,'nice ...
最新文章
- 封闭、缺少代码审查,硕士刚毕业的“老”工程师揭露机器学习残酷现状!
- arm中断保护和恢复_ARM中断异常处理的返回
- Help Jimmy(递归)
- 添加或删除jupyter notebook的虚拟环境
- 天池 在线编程 回文子串(区间动态规划)
- 洛谷 P1306 斐波那契公约数
- HDFS 读取、写入、遍历文件夹获取文件全路径、append
- qmessagebox 设置显示屏幕中间_windows7屏幕分辨率设置
- 企业IT治理样板间首次直播,教您如何打造高效可控的云环境
- Python设计模式:适配器模式
- wps 打开xml格式乱码_Word和WPS打开文件乱码怎么办?
- 全连接神经网络的二分类问题
- 网络安全技术——网络地址转换(NAT)
- 青少年重度抑郁的动态功能连接:与严重程度和症状维度的关系
- 嵌入式linux检测U盘拔插
- 微信公众号消息text换行问题
- 简易炸弹超人 题解(蓝桥杯中级组2023选拔赛)
- 关于mysql百万100W数据查询优化
- x722网卡支持百兆吗_用200M宽带,电脑网卡却只有百兆?这样可以解决!
- 一道烧脑的双重否定逻辑题
热门文章
- java生成图片url_Java Springboot如何基于图片生成下载链接
- 看完这篇文章,还说自己不会使用Zookeeper命令吗
- 用matlab找出所有真因子,在matlab中找出与fmincon匹配两条曲线的缩放因子
- zabbix mysql密码_重置Zabbix数据库Admin的密码
- 一次完整的HTTP请求响应过程(很详细)
- 移动端列表以树的形式展示
- 史上最全的JFinal源码分析(不间断更新)
- ssh 配置文件中 maxsessions 与 MaxStartups
- Grafana-zabbix配置模板
- Serf:Gossip Protocol