网站首页 > 技术文章 正文
概述
大家都知道硬解析,软解析对数据库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 setmypid Statement processed. SQL> oradebug tracefile_name /u01/app/oracle/diag/rdbms/nwppdb/nwppdb/trace/nwppdb_ora_3671.trc SQL> 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数据库最需要关注的。
猜你喜欢
- 2024-11-02 「Java基础知识」sql常用语句有哪些
- 2024-11-02 两行Python代码就可以操作Oracle数据库
- 2024-11-02 Oracle 利用索引的SQL语句优化 oracle索引语句sql语句
- 2024-11-02 SQL 数据库语句大全 sql数据库基本语句大全
- 2024-11-02 Oracle优化:sql语句的执行顺序 oracle中sql优化
- 2024-11-02 Oracle 日常管理语句 oracle管理系统
- 2024-11-02 Oracle 数据库高级查询语句方法 oracle查询语句怎么写
你 发表评论:
欢迎- 627℃几个Oracle空值处理函数 oracle处理null值的函数
- 621℃Oracle分析函数之Lag和Lead()使用
- 610℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 604℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 601℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 593℃【数据统计分析】详解Oracle分组函数之CUBE
- 584℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 567℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- oracle 19cOCM认证有哪些内容(oracle认证ocm月薪)
- Oracle新出AI课程认证,转型要持续学习
- oracle 表的查询join顺序,可能会影响查询效率
- Oracle DatabaseAmazon Web Services正式可用,Oracle数据库上云更容易了
- Oracle 19.28 RU 升级最佳实践指南
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
- 如何主导设计一个亿级高并发系统架构-数据存储架构(三)
- Java 后端开发必看!工厂设计模式轻松拿捏
- ORA-00600 「25027」 「x」报错(抱错孩子电视剧 爸爸是武术 另一个爸爸是画家)
- 新项目终于用上了jdk24(jdk新建项目)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)