怎么理解ORACLE的游标共享-创新互联
这篇文章主要讲解了“怎么 理解ORACLE的游标共享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么 理解ORACLE的游标共享”吧!
站在用户的角度思考问题,与客户深入沟通,找到民权网站设计与民权网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、做网站、企业官网、英文网站、手机端网站、网站推广、国际域名空间、虚拟主机、企业邮箱。业务覆盖民权地区。游标共享(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/gjhoe.html