收藏本站

人工智能培训机构,上海涛德,算法工程师,数据科学家高端培训机构-上海涛德

Oracle Database 12c SQL优化器新功能Adaptive Plans(自适应执行计划) ... ...

2013-6-26 22:27| 查看: 2035| 评论: 0

摘要: Oracle Database 12c 正式发布,而且已经在OTN网站可以下载了。 那么Oracle Database 12c有哪些新功能了。下面我们着重聚合Oracle 12c SQL优化器的Adaptive Plans(自适应执行计划) 假如我们要执行以下SQL 查找符合 ...

Oracle Database 12c 正式发布,而且已经在OTN网站可以下载了。

那么Oracle Database 12c有哪些新功能了。下面我们着重聚合Oracle 12c SQL优化器的Adaptive Plans(自适应执行计划)

假如我们要执行以下SQL 查找符合条件的行

可能的Join执行计划有Nested Loops, Hash Join

 

假设我们的实际数据量比较大,但是优化器统计记录的是表比较少。

如果用Explain plan命令显示预估执行计划如下:

很明显走了预估执行计划走了 Nested Loops方式。

 

 

但是如果我们在语句执行之后。用dbms_xplan显示cursor 实际执行计划可以看到以下的内容:

很明显它走了Hash Join 符合我们的实际情况。

 

是什么原因导致优化器变聪明了?答案就是Oracle 12c 引入了Adaptive Plans 功能

 

如果我们在display_cursor的时候加入’adaptive’参数,结果如下

 

: 执行计划中加”-”表示没有执行的非活的的执行计划。

 

注意其中的 “STATISTICS COLLECTOR” 它表示Oracle 优化器在最开始试图采用Nested Loops方式执行前,先读取了ORDER_ITEM2的行记录,如果在读取行数达到一定的阀值。那么Oracle优化器认为要Join的表的数据量过大。应该考虑采用Hash Join

 

一个完整的流程如下:

1 用户语句发布后

2优化器基于现有统计生成一个Nested Loops执行计划,同时还有可选的子计划 Hash Join 也存放到cursor

3 Oracle在执行Nested Loops之前先读取要Join表的行。这些行会暂存内存中

4 当表的行很少,做出决策依旧采用Nested Loops

5 当表的行达到一定阀值,做出决策采用Hash Join 子计划

 

<点击:上海涛德Oracle OCM认证及BI商业智能课程>|人工智能培训-上海涛德 ( 沪ICP备14006824号 )|网站地图   My title page contents

GMT+8, 2019-7-18 22:15 , Processed in 0.125491 second(s), 14 queries , Gzip On.

回顶部