千家信息网

怎么理解数据库的初始化参数cursor_sharing

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"怎么理解数据库的初始化参数cursor_sharing"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读
千家信息网最后更新 2026年11月03日怎么理解数据库的初始化参数cursor_sharing

本篇内容介绍了"怎么理解数据库的初始化参数cursor_sharing"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、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的影响:

2.1 创建实验环境:

----首先创建一张woo表----

WOO@woo> create table woo (id int,name varchar2(10));Table created.Elapsed: 00:00:00.06

---产生一些数据----

WOO@woo> insert into woo values(1,'aa');1 row created.Elapsed: 00:00:00.00WOO@woo> insert into woo values(2,'bb');1 row created.Elapsed: 00:00:00.00WOO@woo> insert into woo values(3,'cc');1 row created.Elapsed: 00:00:00.00WOO@woo> insert into woo values (4,'dd');1 row created.Elapsed: 00:00:00.00WOO@woo> commit;Commit complete.Elapsed: 00:00:00.00WOO@woo> select * from woo;        ID NAME---------- ----------         1 aa         2 bb         3 cc         4 ddElapsed: 00:00:00.01

---创建下面实验将要用到的三张表----

WOO@woo> create table woo_exact as select * from woo;Table created.Elapsed: 00:00:00.01WOO@woo> create table woo_similar as select * from woo;Table created.Elapsed: 00:00:00.01WOO@woo> create table woo_force as select * from woo;Table created.Elapsed: 00:00:00.00

---查看当前session的trace文件的路径----

WOO@woo> SELECT d.Value || '/' || Lower(Rtrim(i.Instance, Chr(0))) || '_ora_' ||  2         p.Spid || '.trc' AS "trace_file_name"  3    FROM (SELECT p.Spid  4            FROM V$mystat m, V$session s, V$process p  5           WHERE m.Statistic# = 1  6             AND s.Sid = m.Sid  7             AND p.Addr = s.Paddr) p,  8         (SELECT t.Instance  9            FROM V$thread t, V$parameter v 10           WHERE v.Name = 'thread' 11             AND (v.Value = 0 OR t.Thread# = To_Number(v.Value))) i, 12         (SELECT VALUE 13            FROM V$parameter 14           WHERE NAME = 'user_dump_dest') d;trace_file_name-------------------------------------------------------/DBSoft/diag/rdbms/woo/woo/trace/woo_ora_37746.trcElapsed: 00:00:00.01

2.2 cursor_sharing=exact的情况:

WOO@woo>  alter session set cursor_sharing=exact;Session altered.Elapsed: 00:00:00.00WOO@woo>  alter session set sql_trace=true;Session altered.Elapsed: 00:00:00.00WOO@woo> select * from woo_exact where id=1;        ID NAME---------- ----------         1 aaElapsed: 00:00:00.00WOO@woo> select * from woo_exact where id=2;        ID NAME---------- ----------         2 bbElapsed: 00:00:00.01WOO@woo> select * from woo_exact where id=3;        ID NAME---------- ----------         3 ccElapsed: 00:00:00.00WOO@woo> select * from woo_exact where id=1;        ID NAME---------- ----------         1 aaElapsed: 00:00:00.00

----从下面的查询可以看出执行了两次硬解析----

WOO@woo> select sql_text from v$sql where sql_text like 'select * from woo_exact where%';SQL_TEXT---------------------------------------------------------------------------------------select * from woo_exact where id=1select * from woo_exact where id=3select * from woo_exact where id=2Elapsed: 00:00:00.05NAME                                                                  VALUE---------------------------------------------------------------- ----------ADG parselock X get attempts                                              0ADG parselock X get successes                                             0parse time cpu                                                          326parse time elapsed                                                      307parse count (total)                                                   56211parse count (hard)                                                     1681parse count (failures)                                                   10parse count (describe)                                                    08 rows selected.

cursor_sharing=similar的情况:

WOO@woo> alter session set cursor_sharing=similar;Session altered.Elapsed: 00:00:00.00WOO@woo> alter system flush shared_pool;System altered.Elapsed: 00:00:00.13WOO@woo> select * from woo_similar where id=1;        ID NAME---------- ----------         1 aaElapsed: 00:00:00.01WOO@woo> select * from woo_similar where id=4;        ID NAME---------- ----------         4 ddElapsed: 00:00:00.00WOO@woo> select * from woo_similar where id=8;no rows selectedElapsed: 00:00:00.00

----在这里可以看到执行两次SQL查询,只进行了一个硬解析----

WOO@woo> select sql_text from v$sql where sql_text like 'select * from woo_similar where %';SQL_TEXT--------------------------------------------------------------------------------------------------------select * from woo_similar where id=:"SYS_B_0"Elapsed: 00:00:00.02WOO@woo> select name,value from v$sysstat where name like '%parse%'; NAME                                                                  VALUE---------------------------------------------------------------- ----------ADG parselock X get attempts                                              0ADG parselock X get successes                                             0parse time cpu                                                          374parse time elapsed                                                      352parse count (total)                                                   57024parse count (hard)                                                     2006parse count (failures)                                                   10parse count (describe)                                                    08 rows selected.Elapsed: 00:00:00.00WOO@woo>

对于SIMILAR的情况,如果CBO发现被绑定变量的谓词还有其他的执行计划可以选择时,如果谓词条件的值有变化,就将会产生一个新的子游标,而不是重用之前的SQL;如果谓词没有其他的执行计划可选择,则忽略谓词的值,重用之前的SQL。

上面的例子还不能足以说明该情况,接着下面的模拟:

cursor_sharing=force的情况

WOO@woo> alter session set cursor_sharing=force;Session altered.Elapsed: 00:00:00.00WOO@woo> alter system flush shared_pool;System altered.Elapsed: 00:00:00.07 WOO@woo> alter session set sql_trace=true;Session altered.Elapsed: 00:00:00.02WOO@woo> select * from woo_force where id=1;        ID NAME---------- ----------         1 aaElapsed: 00:00:00.00WOO@woo> select * from woo_force where id=4;        ID NAME---------- ----------         4 ddElapsed: 00:00:00.00WOO@woo> select * from woo_force where id=1;        ID NAME---------- ----------         1 aaElapsed: 00:00:00.00

----从下面的查询中可以看出只进行了一次硬解析,而且使用了绑定变量----

WOO@woo>  select sql_text from v$sql where sql_text like 'select * from woo_force where %';SQL_TEXT-------------------------------------------------------------------------------------------select * from woo_force where id=:"SYS_B_0"Elapsed: 00:00:00.02WOO@woo> select name,value from v$sysstat where name like '%parse%'; NAME                                                                  VALUE---------------------------------------------------------------- ----------ADG parselock X get attempts                                              0ADG parselock X get successes                                             0parse time cpu                                                          379parse time elapsed                                                      355parse count (total)                                                   57385parse count (hard)                                                     2145parse count (failures)                                                   10parse count (describe)                                                    08 rows selected.Elapsed: 00:00:00.01

总结:force是在任何情况下,无条件重用SQL。

"怎么理解数据库的初始化参数cursor_sharing"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

情况 谓词 参数 面的 数据 是在 条件 语句 查询 数据库 不同 内容 变量 实际 更多 游标 知识 实验 影响 选择 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 上海挚品互联网科技有限公司 互联网科技行业发展 互联网与科技金融数据 金融科技创新监管互联网金融 南京欣网互联网科技 友谊互联网络科技 赫美联合互联网科技 四川狮子座互联网科技 互联网金融科技委员会 哈尔滨秒房互联网科技有限公司 太原新华互联网科技学校怎么样 天速互联网络科技有限公司 剑昆互联网络科技有限公司临桂 来此购互联网科技有限公司 玉溪互联网科技怎么选 互联网科技资金流入 互联网与数字科技关系 山东大美朱楼互联网科技有限公司 济南小医互联网科技有限公司招聘 互联网科技金融公司 互联网 的科技创新 安徽鑫晟辉互联网科技 银优互联网科技有限公司 甘肃拓世互联网科技有限公司 玖二柒互联网科技公司待遇 隆华科技工业互联网 翼展科技 首家互联网医院 山东有哪些互联网科技公司 玉溪新华互联网科技怎么选
0