oracle 自适应执行计划

2023年 11月 17日 74.8k 0

   自适应执行计划

对象统计信息并不总是会为查询优化器提供用于找出最优执行计划所需的全部信息。为了改进这种情况,在解析阶段,查询优化器可以利用动态采样对要处理的数据获取额外的洞察力。

 

此外,自从12.1版本开始,查询优化器能够将某些决定推迟到执行阶段。其思路是,利用在执行计划的执行部分可以收集的信息来决定应该如何执行其他部分。基于这个目的,查询优化器引入了所谓的子计划。同时引入的还有负责决定应该激活哪个子计划的操作。

 

注意 自适应执行计划只有在企业版中才可用。

 

从12.1版本开始,查询优化器能在以下状况中使用自适应执行计划。

Ø  从嵌套循环联接切换到散列联接,反之亦然。

Ø  为并行执行的SQL语句从散列向广播切换分配方法。

 

下面的例子演示切换联接方法是如何实现的。这是一段来自adaptive_plan.sql脚本生成输出的摘录。此查询是一个两张表之间的简单联接。它通过普通的嵌套循环联接执行:

EXPLAIN PLAN FOR SELECT * FROM t1, t2 WHERE
t1.id = t2.id AND t1.n = 666;

select * from table(dbms_xplan.display(format=>'basic
+predicate +note'));

Predicate information(identified  by 
operation  id):

-------------------------------------------------------

3- filter("T1"."N"=666)

4-
access("T1"."ID"="T2"."ID")

 

Note

 -
this is an adaptive plan

 

注意,上面摘录中末尾的Note部分指出了这个执行计划是自适应的。然而,就执行计划本身而言,却没有任何特别的地方。而事实是,默认情况下,dbms_xplan包的display函数只显示默认的执行计划。

 

简单来说,这是查询优化器在不考虑自适应执行计划时会选择的执行计划。如果想看见包含子计划的完整执行计划,必须在使用dbms_xplan包时指定adaptive修饰符。在这种情况下,有三个额外的操作会在该执行计划中显示:

select * FROM
table(dbms_xplan.display(format=>' basic +predicate +note +adaptive'));

1-
access("T1"."ID"="T2"."ID")

5- filter("T1"."N"=666)

6-
access("T1"."ID"="T2"."ID")

 

Note

- this is an adaptive plan(rows marked '-'
are inactive)

 

这样的一个执行计划并不容易读取,因为它其实包含两个不同的执行计划。首先,是基于嵌套循环联接的默认执行计划:

接下来,是基于散列联接的自适应执行计划:

基本上,当t1表的扫描返回少量的数据时,第一个执行计划比第二个好。因此,要决定应该使用哪个执行计划,查询优化器会估算能够被嵌套循环联接有效处理的最大行数(称作转折点)。为了在执行阶段期间决定应该使用哪个执行计划,STATISTICS
COLLECTOR操作缓存并记录t1表的扫描返回的记录数。

 

然后,只有当记录数低于转折点的数值时,嵌套循环联接才会被执行。否则,散列联接会被执行。此时的执行计划通常被称作最终执行计划。一旦最终执行计划确定下来,就会禁用STATISTICS COLLECTOR操作,因此,不会发生进一步的缓存。此外,与转折点方法有关的操作也会禁用。

 

注意 要知道执行计划切换只会发生在子游标第一次执行时。所有后续执行都使用最终执行计划

 

v$sq1动态性能视图提供一个新的列帮助你了解,对于一个特定的子游标其最终执行计划是否已经选定。这个列就是is_resolved_adaptive_plan。它会被设置为以下值。

Ø  NULL意味着与该游标关联的执行计划不是自适应的。

Ø  N意味着最终执行计划还没有被确定下来。这个值只有在最终执行计划被确定下来之前才可以观察到。

Ø  Y意味着最终执行计划已经被确定下来。

 

两个初始化参数控制自适应执行计划。

Ø  optimizer_adaptive_features 完全启用或禁用该特性。将这个参数设置为FALSE时,会禁用自适应执行计划。默认值是TRUE。

Ø  optimizer_adaptive_reporting_only在报告模式下启用或禁用自适应执行计划。这个模式对于评估执行计划是否会因为自适应执行计划而改变非常有用。当设置为TRUE时,就会生成自适应执行计划,SQL引擎会检查转折点,但是SQL引擎只会使用默认的执行计划。然后,通过下面的例子所示的报告特性,可以检查如果完全启用自适应执行计划,那么会使用哪一个执行计划。默认值是FALSE:

 

ALTER SESSION SET
optimizer_adaptive_reporting_only = TRUE;

select * FROM t1,t2 WHERE ti.id = t2.id AND
t1.n=666;

select * FROM table(dbms_xplan.display_cursor(format=>'basic
+predicate +note +adaptive +report'));

为了控制在语句级别是否用了自适应计划,自12.1.0.2起可使用hint(no_)adaptive_plan。

相关文章

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

发布评论