怎么理解ORACLE的游标共享

这篇文章主要讲解了“怎么 理解ORACLE的游标共享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么 理解ORACLE的游标共享”吧!

创新互联自2013年创立以来,先为万安等服务建站,万安等地企业,进行企业商务咨询服务。为万安企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

游标共享(cursor sharing)指的是share cursor的共享

做到游标共享很简单,使用绑定变量就可以实现,但是会遇到下面两个问题

1、开发人员在开发时,未使用绑定变量,这是如果要用绑定变量,就会大量更改sql.

2、使用了绑定变量,但是由于绑定变量窥探的影响,会使某些解析树和执行计划不合时宜

针对上面两个问题,分别用两种游标共享来解决

1、常规游标共享 ,解决问题1

通过参数cursor_sharing启用系统绑定变量

exact  不启用绑定变量

similar 只对安全的谓语条件启用,所谓的安全,就是执行计划不会随着这个值的变化而发生变化,比如主键列的等值查询,而范围类的查询则是不安全的,比如大于,小于,like ,这是一个过时的值,任何时候都不要设置为这个值

force 启用绑定变量,要在不改代码的情况下,使那些where 字句或者values子句(insert) 共享相同的执行计划和解析,可以用这个值。

2、自适应游标共享

11g中引入了自适应游标共享

bind sensitive 指某个含有绑定变量的目标SQL执行计划可能随着绑定变量输入值的变化而变化。当满足下列三个条件时,目标SQL对应的child cursor 会被标记为bind sensitive .

1)启用绑定变量窥探

2)该SQL使用了绑定变量

3)该SQL是不安全的谓语条件(比如范围查询,目标列有直方图统计信息的等值查询)

bind aware 确定含有绑定变量的目标SQL执行计划会随着绑定变量输入值的变化而变化,满足下列两个条件,目标SQL对应的child cursor 会被标记为bind aware

1)已被标记为bind sensitive

2)该SQL接下来的两次执行,对应的runtime统计信息跟硬解析时的runtime统计信息相比差异较大。

v$sql中的三列:is_bind_sensitive   is_bind_aware  is_shareable

自适应游标共享相关的两个视图:v$sql_cs_statistics   v$sql_cs_selectivity

v$sql_cs_statistics显示指定child_cursor 的runtime 统计信息

v$sql_cs_selectivity 显示指定的,已被标记为bind_aware的child_cursor中存储的含绑定变量的谓语条件对应的可选择率范围。

自适应游标的整体执行过程:

1、sql第一次执行,硬解析,然后根据一系列条件(有没有使用绑定变量,cursor_sharing的值,绑定变量列有没有直方图,等值查询还是范围查询等)来判断是否将child_cursor标记为bind_sensitive,如果已标记,会把执行该SQL的runtime统计信息额外存储在child cursor中

2、第二次执行该SQL,会用软解析,并重用之前的解析树和执行计划

3、第三次执行,如果之前child_cursor已经被标记为bind_sensitive,而且第二次,第三次执行该sql的runtime统计信息和硬解析时的runtime统计信息相差过大,则会重新硬解析该SQL,同时生成一个新的child cursor ,并把该child cursor标记为bind_aware。

4、对于标记为bind aware的sql ,再一次执行时,会根据谓语条件中绑定变量的可选择率来选择硬解析还是软解析。判断条件是,该选择率位于该SQL硬解析时同名谓语条件在v$sql_cs_statistics中的选择率范围内,则用软解析,反之则用硬解析。

感谢各位的阅读,以上就是“怎么 理解ORACLE的游标共享”的内容了,经过本文的学习后,相信大家对怎么 理解ORACLE的游标共享这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


分享标题:怎么理解ORACLE的游标共享
链接地址:http://myzitong.com/article/ihephd.html