ORACLE的游标共享

来源:这里教程网 时间:2026-03-03 14:40:12 作者:

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

相关推荐