11g cursor_sharing 参数说明
一. 官网的说明
http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025
1.1 CURSOR_SHARING
Property |
Description |
Parameter type |
String |
Syntax |
CURSOR_SHARING = { SIMILAR | EXACT | FORCE } |
Default value |
EXACT |
Modifiable |
ALTER SESSION, ALTER SYSTEM |
Basic |
No |
CURSOR_SHARING determines what kind of SQL statements can share the same cursors.
Only allows statements with identical text to share the same cursor.
--只有SQL 语句完全相同的情况下,才会使用相同的cursor,即执行计划。
1.2 When to Set CURSOR_SHARING to a Nondefault Value
Setting CURSOR_SHARING to FORCE or SIMILAR has the following drawbacks:
(3)Star transformation is not supported.
When set to SIMILAR, database behavior depends on the presence of histograms:
(1)Histogram absent for column with system-generated bind value
(2)Histogram present for column with system-generated bind value
For example, consider the following statement:
SELECT * FROM hr.employees WHERE employee_id = 101
http://blog.csdn.net/tianlesoftware/archive/2010/09/01/5856430.aspx
2.1 cursor_sharing=exact,这是cursor_sharing的默认值
SYS@anqing2(rac2)> show parameter cursor_sharing
------------------------- -------------------- ---------------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
parse count (hard) 9890010(硬解析次数)
SYS@anqing2(rac2)> select * from ta where id=168;
---------- ------------------------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
-- 这里硬解析的次数加一,因为之前SQL 没有解析过,所以需要进行硬解析之后才能执行。
SYS@anqing2(rac2)> select * from ta where id=198;
---------- ------------------------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
SYS@anqing2(rac2)> select * from ta where id=198;
---------- ------------------------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
在这种模式下,只有SQL 语句完全相同的情况下,才会使用相同的cursor,即执行计划。
这种模式下,表有统计信息和没有统计信息的执行计划是有出入的。 所以该模式下的表,需要定期的去收集统计信息。
SYS@anqing2(rac2)> alter session set cursor_sharing='force';
SYS@anqing2(rac2)> show parameter cursor_sharing
------------------------- --------------------- ---------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
parse count (hard) 9890067 (硬解析次数)
SYS@anqing2(rac2)> select * from ta where id=88;
---------- ------------------------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
parse count (hard) 9890068 -- 硬解析次数加一
SYS@anqing2(rac2)> select * from ta where id=99;
---------- ------------------------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
--注意,这里的硬解析次数没有变化,这个就是force 的作用。只要sql语句相同,不管谓词值是否相同,都会当成相同的sql,重用之前的cursor,不会进行硬解析。
SYS@anqing2(rac2)> select sql_text,child_number from v$sql where sql_text like 'select * from ta where%';
---------------------------------------- ------------
select * from ta where id=:"SYS_B_0" 0
select * from ta where id=:"SYS_B_0" 1
select * from ta where id=:"SYS_B_0" 2
SQL>select * from v$sql_shared_cursor where sql_id='c9swtz4spq3xz';
http://blog.csdn.net/tianlesoftware/archive/2010/09/06/5867276.aspx
FORCE limits the growth of child cursors that can occur when the setting is SIMILAR.
在这种模式下,对表做统计和没做统计分析是不一样的。有关统计信息,参考我的Blog:
http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668723.aspx
SYS@anqing2(rac2)> exec dbms_stats.delete_table_stats('SYS','TA');
PL/SQL procedure successfully completed.
SYS@anqing2(rac2)> alter session set cursor_sharing='similar';
SYS@anqing2(rac2)> show parameter cursor_sharing
---------------------- ------------------ ----------------
在similer模式下,且没有直方图,等于force 模式。 看测试:
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
SYS@anqing2(rac2)> select * from ta where id=238;
---------- ------------------------------
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
parse count (hard) 9890539 硬解析加一
SYS@anqing2(rac2)> select * from ta where id=2397;
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
---------------------------------------- ------------
select * from ta where id=238 0
select * from ta where id=2396 0
select * from ta where id=2391 0
select * from ta where id=2397 0
这里并没有将谓词值转换成变量,也就是说similar 没有生效,没有达到force的效果。
http://forums.oracle.com/forums/message.jspa?messageID=3569923#3569923
解决方法就是在指定cursor_sharing 之前,执行2次flush shared_pool. 测试一下看看。
SYS@anqing2(rac2)> alter system flush shared_pool;
SYS@anqing2(rac2)> alter system flush shared_pool;
SYS@anqing2(rac2)> alter session set cursor_sharing=similar;
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
SYS@anqing2(rac2)> select * from ta where id=232;
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
SYS@anqing2(rac2)> select * from ta where id=23218;
SYS@anqing2(rac2)> select name,value from v$sysstat where name like '%parse%';
------------------------------ ----------
--硬解析又增加了,如果说只有这一条SQL执行,不会增加硬解析。这个是其他的SQL 带来的硬解析,我们可以查看v$sql验证:
SQL_TEXT CHILD_NUMBER EXECUTIONS
---------------------------------------- ------------ ----------
select * from ta where id=:"SYS_B_0" 0 2
-- 在这里,已经使转成成了变量,并且执行了2次。这说明,我们的force是生效的。
当cursor_sharing 设置为similar,并且表上存在histograms时, 这时候的similar 等于 默认值 exact. 下面我们验证一下。
PL/SQL procedure successfully completed.
这部分内容,具体可以参考我的blog: Oracle Statistic 统计信息小结
http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668723.aspx
SYS@anqing2(rac2)> SELECT column_name, num_distinct, num_buckets, histogram
2 FROM DBA_TAB_COL_STATISTICS WHERE table_name = 'TA' AND column_name = 'ID';
COLUMN_NAME NUM_DISTINCT NUM_BUCKETS HISTOGRAM
------------------------------ ------------ ----------- ---------------
SYS@anqing2(rac2)> alter system flush shared_pool;
SYS@anqing2(rac2)> alter system flush shared_pool;
SYS@anqing2(rac2)> show parameter cursor_sharing
------------------------ -------------------------------- ----------
SQL_TEXT CHILD_NUMBER EXECUTIONS
--------------------------------------------- ------------ ----------
select count(*) from ta where id>:"SYS_B_0" 0 3
SYS@anqing2(rac2)> select count(*) from ta where id>10000;
SQL_TEXT CHILD_NUMBER EXECUTIONS
--------------------------------------------- ------------ ----------
select count(*) from ta where id>:"SYS_B_0" 0 3
select count(*) from ta where id>:"SYS_B_0" 1 1
--因为ID值和之前的不一样,所以没有重用之前的cursor,而是重新创建了一个
SYS@anqing2(rac2)> select count(*) from ta where id>100;
SQL_TEXT CHILD_NUMBER EXECUTIONS
--------------------------------------------- ------------ ----------
select count(*) from ta where id>:"SYS_B_0" 0 3
select count(*) from ta where id>:"SYS_B_0" 1 1
select count(*) from ta where id>:"SYS_B_0" 2 1
SYS@anqing2(rac2)> select count(*) from ta where id>90808;
SQL_TEXT CHILD_NUMBER EXECUTIONS
--------------------------------------------- ------------ ----------
select count(*) from ta where id>:"SYS_B_0" 0 3
select count(*) from ta where id>:"SYS_B_0" 1 1
select count(*) from ta where id>:"SYS_B_0" 2 1
select count(*) from ta where id>:"SYS_B_0" 3 1
select count(*) from ta where id>:"SYS_B_0" 4 1
select count(*) from ta where id>:"SYS_B_0" 5 1
select count(*) from ta where id>:"SYS_B_0" 6 1
select count(*) from ta where id>:"SYS_B_0" 7 1
-- 这个就像我们开始说的,虽然会对变量进行转换,但不会重用,只有谓词值一样的时候才重用之前的cursor。
SYS@anqing2(rac2)> select count(*) from ta where id>90808;
SQL_TEXT CHILD_NUMBER EXECUTIONS
--------------------------------------------- ------------ ----------
select count(*) from ta where id>:"SYS_B_0" 0 3
select count(*) from ta where id>:"SYS_B_0" 1 1
select count(*) from ta where id>:"SYS_B_0" 2 1
select count(*) from ta where id>:"SYS_B_0" 3 1
select count(*) from ta where id>:"SYS_B_0" 4 1
select count(*) from ta where id>:"SYS_B_0" 5 1
select count(*) from ta where id>:"SYS_B_0" 6 1
select count(*) from ta where id>:"SYS_B_0" 7 2
-- 注意这里,因为我们执行了一个一样的SQL,包括谓词,这里的重用了之前的cursor。
当cursor_sharing 设置为similar时,Oracle 会对SQL 的位置值转换成常量,这个和force 一样。 但是不同的是:
(1)当字段上有histograms时, 这时等于exact,虽然SQL text 一样,但谓词值不同就不会重用cursor。 只有SQL 语句完全一样,包括谓词值,才会重用cursor。
(2)当没有statstics时,即没有histograms,这时等于force,只要SQL 语句一样,就会重用cursor。
在eygle 的blog上看到similar 对增加expdp备份的时间。
http://www.eygle.com/archives/2011/01/cursor_sharing_expdp.html
Oracle 10g Data Pump Expdp/Impdp 详解
http://blog.csdn.net/tianlesoftware/archive/2009/10/15/4674224.aspx
http://blog.csdn.net/tianlesoftware/archive/2011/03/18/6260138.aspx
SYS@anqing2(rac2)> show parameter cursor_sharing
------------------------------------ ----------- ------------------------------
[oracle@rac2 backup]$ expdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp.dmp logfile=fullexp.log
Export: Release 10.2.0.4.0 - Production on Friday, 17 June, 2011 13:54:40
Job "SYS"."SYS_EXPORT_FULL_01" successfully completed at 14:05:49
cursor_sharing是一个动态参数,可以在执行expdp之前进行修改,然后执行导出, 备份完在改回来。
SYS@anqing2(rac2)> alter system set cursor_sharing=similar scope=memory;
SYS@anqing2(rac2)> show parameter cursor_sharing
------------------------------------ ----------- ------------------------------
Export: Release 10.2.0.4.0 - Production on Friday, 17 June,2011 13:40:37
Job "SYS"."SYS_EXPORT_FULL_01" successfully completed at 13:52:42
因为库不大,所以差距不明显. 不过如果库大的话,一般也不会用expdp来备份。所以这里作为一个知识点,了解一下。
11g cursor_sharing 参数说明相关推荐
- local_listener 与 remote_listener 参数说明
一. LOCAL_LISTENER 和 REMOTE_LISTENER说明 1.1 LOCAL_LISTENER 官网信息如下: Property Description Parameter ty ...
- cursor_sharing='SIMILAR'将被废弃
根据metalink文档<ANNOUNCEMENT: Deprecating the cursor_sharing = 'SIMILAR' setting [ID 1169017.1]>在 ...
- Oracle 11g 新特性 -- 自适应游标共享(Adaptive Cursor Sharing: ACS) 说明
一.自适应游标共享(Adaptive Cursor Sharing) 说明 1.1 ACS概述 绑定变量使Oracle DB 可以为多条SQL 语句共享单个游标,以减少分析SQL 语句所使用的共享内存 ...
- 阿里云 centos安装oracle 11g 完全图解
摘要: 说明: Linux服务器操作系统:CentOS 5.8 32位(注意:系统安装时请单独分区/data用来安装oracle数据库) Linux服务器IP地址:192.168.21.150 Ora ...
- CentOS 安装Oracle 11g R2
最近配置项目的测试系统需要安装oracle,网上找了几个比较好的教程分享一下 参考地址:http://www.osyunwei.com/archives/5445.html Oracle数据库版本:l ...
- Linux下Oracle 11G r2 (64位)安装
一.硬件配置 IBM3850(以安装环境为基础) 二.软件准备 linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip ...
- 【小麦苗课堂】高可用培训(RAC+DG+OGG)--包括11g、12c、18c、19c等版本
1 现有课程 2 网络连接说明 培训项目 连接地址 DB笔试面试历史连接 http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w OCP培训说明连接 ht ...
- OGG12.1(LINUX) for 11G R2 RAC classical install 经典抽取模式单项同步配置OGG12.1
博文结构图如下: 一.环境描述以及注意事项 1.1 环境简介 IP 系统 Oracle版本 OGG版本 源端 172.16.10.16/36 RHEL6.5 oracle11204 12.1 目标端 ...
- oracle确认AMM是否开启,【AMM】关于数据库实例AMM参数说明
Automatic Memory Management 参数说明 官方介绍 About Automatic Memory Management The simplest way to manage i ...
最新文章
- office2007/2010/2013/2016安装出现错误:无法安装64位版本的office,因为在您的PC上......
- spring-boot启动源码学习-1
- linux gdb 格式化结构体输出
- 通过SecureCRT连接Vmware中的RHEL6.3的方法
- 第八讲 一阶常系数线性ODE(续)
- Bootstrap公司年会抽奖活动代码
- python Fabric库学习
- 2016年10个重要的可视化发展
- java获取mysql数据定时执行_mysql 事件处理(定时触发某个任务或存储过程等)
- Vue.js 服务器端渲染指南
- 记录一次.net 4.7.2安装失败解决情况
- [原创]FlashFXP打造自动镜像更新
- 图深度学习 Deep Learning on Graph
- SNF快速开发平台2019-权限管理模型-平台服务(多平台\多组织\SAAS\多系统)
- android 获取权限管理,Android获取超级管理员权限的实现
- 阿里云5m带宽能支持多少人访问_阿里云618年中大促:云服务器低至7.65元/月 可选购3年版免续费之忧...
- VS2015调试dump文件时提示未找到xxx.exe或xxx.dll
- 微信小程序-自用学习总结
- xgboost 怎么读_当初零基础入学的小学生,现在怎么样了?妈妈:每天辅导到十点...
- CUDA学习第二天: GPU核心与SM核心组件
热门文章
- python设计要求_Python高级应用程序设计任务要求
- mql 查询多结果_一篇文章带你全面掌握Excel中的各种数据查询知识与技巧
- mysql redis hbase_10分钟梳理MySQL核心知识点
- Docker安装实践Jenkins
- jwt token 附加用户信息_JWT的正确使用方法,API开发为什么使用JWT
- Unity内存管理你应该知道的底层原理
- Addressable系统的加载资源API总结
- [洪流学堂]Hololens修改图标icon
- Python 3.5 正式退役,不再受支持
- VSCode TODO 帮助扩展