oracle 自适应游标共享ACS 1

2023年 8月 18日 113.5k 0

从11.1版本开始,数据库引擎启用一个称为自适应游标共享(adaptive cursor sharing,也称为绑定感知游标共享,bind-aware cursor sharing)的新特性。它的目的是自动识别出因重复利用已经可用的游标导致的低效的执行。要理解这个特性如何工作,我们从查看由v$sq1提供的一些信息开始。

  • is_bind_sensitive 不仅表明绑定变量扫视是否用于生成执行计划,同时也表示自适应游标共享可能会被考虑。如果是这样,此列值设置为Y,否则就设置为N。

  • is_bind_aware 表明游标是否使用自适应游标共享。如果是,列值为Y;如果不是,则设置为N。

  • is_shareable 表明游标是否可共享。如果可以,列设置为Y;否则,值为N。如果值为N,则游标不再被重用。

SELECT child_number, is_bind_sensitive, is_bind_aware, is_shareable, plan_hash_value
FROM v$sql
WHERE sql_id = 'asth1mx10aygn';

自适应游标共享有两个主要的限制。
第一,默认情况下,游标是按照绑定不敏感创建的。
第二,对于给定的游标,绑定感知不是持续的。

结果就是,在一个游标从自适应游标共享中获益之前,至少有一次执行是无效率的,在某些情况下甚至有多次执行(当曾经有很多次高效执行时)是无效率的。自11.1.0.7版开始,才有可能通过指定bind_aware这个hint来避免这些限制。注意,在下面的例子中,两个子游标都是绑定敏感的,且都使用了高效的执行计划。

警告 绑定感知的游标是必要的,对于每次解析,查询优化器都对它们的谓词进行选择率的估算。基于这个原因,数据库引擎有时会禁用自适应游标共享。有两个常见情况需要考虑:第一个是当SQL语句包含的绑定变量超过14个时;第二个是当查询优化器不能正确估算选择率时。例如,当变量需要隐式数据类型转换(这是使用正确数据类型的另一个理由),选择率无法估算出来时,或者引用的对象没有对象统计信息时。

虽然使用绑定变量减少了分析时间和内存使用,从而改善了性能和可伸缩性,但字面值产生的执行计划实际上比变量绑定值产生的执行计划要好。如果你通过设置CURSOR_SHARING参数为EXACT或SIMILAR,在数据库中强制进行游标共享时,某些SQL语句对某些绑定变量值最终得到的是次最优计划。

如果基于成本的优化程序碰巧窥视到绑定值,而且第一条SQL语句使用的进入共享池的绑定值是变量的不真正具有代表性的值,则基于成本的优化程序很可能会创建一个次优计划。开发人员和DBA有时借助于设置非正式的Oracle初始化参数_OPTIM_PEEK_USER_BINDS(ALTER SESSION SET "_optim_peek_user_binds"=FALSE;)以阻止数据库窥视绑定值。自盘应游标共享提供了阻止优化程序创建由绑定窥视所导致的次最优计划的一个更好的方法。

Oracle在初次分析一条SQL语句时,依赖于它的“绑定窥视”技术。优化程序将总是硬分析一条新语句,并且窥视绑定变量值以理解其特性。它在纵定窥视中看到的初始绑定值对它为语句选定的执行计划具有过度的影响。

例如,如果绑定窥视指示使用一个索引,Oracle将不断地这样做,即使后来这些值指示使用一个全扫描也是如此。因为绑定窥视在这些情况中实际得到的是次最优执行计划,所以硬编码变暈值比绑定值更可取。

如前所述,使用绑定变最的游标共享并不总是能得到最好(最优)执行计划。使用变量的硬编码值实际上可能比使用绑定变量得到更优的执行计划,特别是在处理极大地扭曲了的数据时更是如此。

因此,Oracle提供了自适应游标共享特性,它企图解决使用绑定变量的游标共享与査询优化之间的矛盾。使用自适应游标共享,当数据库估计出生成一条语句的新执行计划比重用相同的游标的花费更低时,它将生成语句的新子游标。数据库力争使子游标的数目最小,以利用游标共享。但是,数据库不会盲目地重用游标。

提示 自适应游标共享是自动的,它总是打开的,你不能关闭它。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论