ITPub博客

首页 > 数据库 > Oracle > ORACLE的游标共享

ORACLE的游标共享

原创 Oracle 作者:james210 时间:2019-12-02 18:07:34 0 删除 编辑

游标共享(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中的选择率范围内,则用软解析,反之则用硬解析。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26031282/viewspace-2666563/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-11-07

  • 博文量
    16
  • 访问量
    11639