在Oraclei里有一个内部新特性它允许SQL基于代价的优化器(costbased optimizerCBO)改变执行计划即使正在使用优化器计划的稳定性叫做窥视(peeking)当绑定变量导致SQL的执行计划发生重大改变的时候它允许SQL的CBO更该执行计划
但是指针共享在优化的时候有一个处理延迟只有当应用程序生成动态SQL的时候或者它在必须嵌入文字值的应用程序里的时候它才应该被使用由于绑定变量的缘故PL/SQL应用程序不会从指针共享里获益
为了说明这一问题你可以考虑以下这样一个例子我们的CURSOR_SHARING参数被设置为FORCE这会把所有的SQL文字值都改为库缓沖区里的主变量(host variable)
现在让我们假设我们有了一个对客户(customer)表格的区域(region)列的索引区域列有四个值东(east)南(south)西(west)北(north)区域列的数据值高度不对称%的值都在南部地区
所以在指定南部的时候让SQL的CBO来执行完整的表格扫描而在指定东西北的时候使用索引范围扫描这样速度会更快在使用指针共享的时候SQL的CBO会把SQL里的任何文字值都改为绑定变量所以这个陈述式可以改成下面这样
select customer_stufffrom customerwhere region = west; 这个转换会把文字west替换成主变量select customer_stufffrom customerwhere region = :var;
在Oraclei里SQL的CBO会在第一次调用指针的时候窥视由用户定义的绑定变量的值这就能够让优化器确定WHERE子句操作符的选择性并在south值每次出现在SQL的时候更改执行计划
当绑定变量用于高度不对称的数据列时这就极大地提高了指针共享的性能在Oraclei里我们看到了一个用于CURSOR_SHARING的新设置叫做SIMILAR
有了CURSOR_SHARING=SIMILAROracle会切换到绑定变量如果这样做不会导致结果产生任何变化的话但是如果使用绑定变量会造成结果的巨大变化它就会使用文字值