今天在PUB上看到在讨论关于cursor_sharing的问题,于是,搜索资料,记录了一下,以备查用!
cursor_sharing是从8I开始提出的在服务器端处理SQL绑定的参数,它有如下几个值。
force, similar, exact
1: force表示强行对SQL语句进行变量绑定,如
select * from mytest where name = 'jack';
IXDBA.NET社区论坛
SQL语句传到server端后,会生成select * from mytest where name =:"SYS_B_0" 的SQL版本,后面在运行相同的查询,但name字段的传值不同,也会利用前面生成的查询计划,这个参数在一些没有绑定变量的应用程序里面会带来很好的性能收益,避免了过度的硬解析,但也有弊病,因为随着传入数据的不同,需要执行不同的查询方案,比如走full scan还是走index range scan,可能有时候会运用错误的方案进行查询,
2:exact表示每个SQL语句应该精确匹配,包括大小写,空格等,相同的才可能被重用。
3:similar是上面两者的结合体,如果查询的sarg字段存在柱状图信息,则随着传值的不同,每次都要硬解析,此时等同与exact,如果不存在柱状图信息,则强行绑定,等同与force(柱状图描述了相关字段的数据分布,这个对索引的选用有很大影响)
一个好的应用程序不应该使用force选项。