关于CURSOR_sharing的分析
今天看到SQL优化的教程,在讲语句优化的时候提到的绑定变量和这个参数。
为此是特别做了下研究。
cursor_sharing是从8I开始提出的在服务器端处理SQL绑定的参数,他由个值
force,similar,exact
force表示强行对SQL语句进行变量绑定,如
select * from mytest where name = 'jack';
SQL语句传到server端后,会生成select * from mytest where name =:"SYS_B_0" 的SQL版本,后面在运行相同的查询,但name字段的传值不同,也会利用前面生成的查询计划,这个参数在一些没有绑定变量的应用程序里面会带来很好的性能收益,避免了过度的硬解析,但也有弊病,因为随着传入数据的不同,需要执行不同的查询方案,比如走full scan还是走index range scan,可能有时候会运用错误的方案进行查询,
exact表示每个SQL语句应该精确匹配,包括大小写,空格等,相同的才可能被重用
similar是上面两者的结合体,如果查询的sarg字段存在柱状图信息,则随着传值的不同,每次都要硬解析,此时等同与exact,如果不存在柱状图信息,则强行绑定,等同与force(柱状图描述了相关字段的数据分布,这个对索引的选用有很大影响)
一个好的应用程序不应该使用force选项
SQL> show parameter cursor
NAME TYPE VALUE
------------------------------------ ----------- ------------------
cursor_sharing string EXACT
cursor_space_for_time boolean FALSE
open_cursors integer 300
session_cached_cursors integer 20
SQL>
根据标记可以看出。默认是EXACT,也就是不启用共享。
其实这个参数用的是不得已而为之的,因此在修改这个参数的时候一定要提前做好测试,