【DB笔试面试587】在Oracle中,常规游标共享和自适应游标共享的联系和区别有哪些?
- 2019 年 10 月 10 日
- 筆記
♣
题目部分
在Oracle中,常规游标共享和自适应游标共享的联系和区别有哪些?
♣
答案部分
从严格意义上来说,常规游标共享和自适应游标共享是各自独立的,两者之间没有必然的联系。
常规游标共享的目的是通过使用系统产生的绑定变量替换目标SQL的SQL文本中的具体输入值,以达到在不改一行应用代码的情况下,使那些仅仅是SQL文本的WHERE条件或者VALUES子句(适用于INSERT语句)中的具体输入值不同的目标SQL彼此之间共享解析树和执行计划。而自适应游标共享的目的在于通过适时触发硬解析的动作来缓解绑定变量窥探所带来的副作用。
在Oracle 11g中,对于使用了绑定变量的目标SQL而言,不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的,只要满足一定的条件(比如绑定变量窥探被开启,该SQL中使用的绑定变量的数量不超过14等),自适应游标共享就能生效。例如,如果参数CURSOR_SHARING的值为EXACT,那么必须在目标SQL使用自定义的绑定变量后自适应游标共享才能生效;而当参数CURSOR_SHARING的值为FORCE时,即使目标SQL没有使用自定义的绑定变量,自适应游标共享也能生效。
在自适应游标共享被开启的情况下,Oracle并不推荐将CURSOR_SHARING的值设为SIMILAR,因为当把CURSOR_SHARING的值设为SIMILAR后,对自适应游标共享可能有不好的影响,因为SIMILAR本来就是一个即将过时的值,它有太多的副作用,无论什么时候都不要将CURSOR SHARING的值设为SIMILAR。
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。