本中由于绑定变量窥探导致SQL语句无法获得最佳执行计划的缺陷,即能够对效率低下的游标(子游标)进行自动识别而选择最佳的执行计划。本
文详细描述了自适应游标共享并给出示例。
有关绑定变量窥探请参考: Oracle 绑定变量窥探
    
      
        一、示例自适应游标共享
        
      
          1、创建演示环境        
    
  
2、使用绑定变量执行SQL语句并获得首次执行情况
        3、自适应游标共享的外在体现
    
             自适应游标共享主要通过三个字段来得以体现,即is_bind_sensitive,is_bind_aware,is_shareable。(注:此三个字段仅在Oracle 11g
    
             中存在)。通过上面从v$sql(v$sqlarea中不存在is_shareable)的查询可知,三个字段分别被赋予了不同的值,代表了不同的含义。
    
           
    
           is_bind_sensitive(绑定是否敏感)
    
               表示该子游标中是否使用了绑定变量要素,且采用bind peeking方法进行执行计划生成。如果执行计划依赖于窥探到的值,此处为Y,
    
               否则为N。
    
           
    
           is_bind_aware(绑定是否可知)
    
               表示该子游标是否使用了extended cursor sharing技术,是则为Y,否则为N,如为N,则该游标将废弃,不再可用。
    
           
    
           is_shareable(是否可共享)
    
               表示该子游标可否被下次软解析是否可共享使用。可共享则为Y,否则为N,表示该子游标失去了共享价值,按LRU算法淘汰。
    
       
    
           由于该SQL语句为首次执行,因此从v$sql查询的结果中得知
    
               is_bind_sensitive 为Y值(首次运行,执行了bind peeking)
    
               is_bind_aware     为N值(首次运行,不被extended cursor sharing支持)
    
               is_shareable      为Y值(执行计划可共享)
  
4、重新赋值后观察游标共享情况
二、自适应游标共享的几个相关视图
    
       1、v$sql_cs_statistics
      
               用于监控自适应游标共享的相关统计信息.下面的查询中列出了每个子游标的peeking情况,以及执行次数,预处理行数,BUFFER_GETS等       
    
  
        2、v$sql_cs_selectivity
    
             显示每个子游标的游标的选择性范围。下面的查询中列出了谓词,选择性范围,列上的选择性的值        
  
        3、v$sql_cs_histogram
    
             用于决定一个查询是否允许自适应游标共享,以直方图形式存储        
  
    
      
        三、总结
        
      
          1、自适应游标共享在SQL语句首次执行时(使用绑定变量),进行窥探,并记录窥探结果,如果后续有相同的的SQL语句执行,则对窥探结果
      
              进行比较以判断是否需要生成新的执行计划。此即为绑定变量是否敏感。
      
           2、绑定变量的可知性用于判断当前的游标是否为可扩展性游标共享,当不可知时,则游标被废弃。
      
           3、自适应游标共享的实质是在Oracle 10g以前的基础上实现了多次绑定变量窥探,增加了获取最佳执行计划选择的机率。
      
           4、尽管使用自适应游标共享特性,但并不能保证每次执行SQL语句一定按最佳计划执行,本次演示中SQL语句的第二次执行并非最佳执行计划。
      
           5、自适应游标共享也不能保证两次执行相同SQL语句一定按相同的执行计划执行,因为自适应游标共享会不断尝试peeking。
      
                      
      
      
        四、延伸参考
        
      
          
      
        Oracle 绑定变量窥探
        
      
          
      
        Oracle自适应共享游标
        
      
          
      
        绑定变量及其优缺点
      
       
    
    
    
          
      
         父游标、子游标及共享游标
      
       
    
    
    
          
      
         dbms_xplan之display_cursor函数的使用
      
       
    
    
    
          
      
         dbms_xplan之display函数的使用
      
       
    
    
    
          
      
         执行计划中各字段各模块描述
      
    
  
    
    
          
    
  


 
					 
					