杨廷琨,网名 yangtingkun

云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家

Oracle在12c之前对于索引范围扫描是没有办法并行执行的,从12.1开始,Oracle可以并行的执行索引扫描。

创建测试环境

SQL> create table t_para_ind (id number, name varchar2(30), created date);

Table created.

SQL> insert into t_para_ind select id, object_name, created from t_big;

6735106 rows created.

SQL> commit;

Commit complete.

SQL> create index ind_para_created on t_para_ind (created);

Index created.

SQL> select banner from v$version;

BANNER

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

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production

强制执行计划采用索引扫描

SQL> select /*+ index(t) */ count(name) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.61

设置语句级并行执行

下面设置语句级并行执行,首先将优化器参数设置为11.2.0.4版本:

SQL> select /*+ index(t) parallel(2) opt_param('optimizer_features_enable', '11.2.0.4') */ count(name) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.64

对于11.2.0.4的优化器版本,即使设置了并行提示,Oracle也会忽略并行,而采用串行索引范围扫描执行计划。

即使都是索引串行扫描,11.2和12c中还是有一点小差异的。在12c中,Oracle引入了批量ROWID提取的新特性,在执行计划中由关键字BATCHED标识。可以看到11.2和12c中执行效率也有很小的差异,而这个性能提升就是这个批量处理新特性带来的。

Oracle无法采用并行执行的原因是由索引的存储结构决定的,当执行索引访问时,Oracle首先定位到Btree索引的根节点,通过与根节点中存储的键值前缀进行比较,定位到枝叶节点,重复比较的过程,最终定位到叶子节点。在叶子节点上Oracle找到了第一条满足条件的键值,然后Oracle会根据叶节点上的链表扫描下一个叶节点,不断重复这个过程,直到不满足查询限制条件的记录出现。

也就是说Oracle需要根据顺序访问一条链表,只有找到第一个索引块才知道下一个要访问的索引块在哪里,因此这个过程没有办法拆分到多个进程同时执行,这就是为什么索引范围扫描一直无法并行的原因。


产品推荐

云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。


实现索引扫描并行执行

Oracle在12c中使得索引扫描可以并行执行,下面看看Oracle是如何实现的:

SQL> select /*+ index(t) parallel(2) */ count(name) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.38

为了输出格式的可读性,把执行计划中和当前关系不大的列去掉了。

可以看到Oracle确实采用了并行的执行计划,而且执行时间也比串行执行快。

如果仔细观察IN-OUT列,就会发现Oracle的并行执行实际上从第6步才开始,第7步是串行到并行的过程,而第7步之前的第9步和第8步都是串行执行。

也就是说Oracle把索引范围扫描的过程分成了两部分,一部分是之前讨论的索引范围扫描部分,而另一部分是索引扫描后根据rowid的读取表中记录的过程。对于前者,即使是在12c中,Oracle仍然采用串行的扫描方式执行,而对于后者,Oracle将其并行化。这也是性能提升的由来。

SQL> select /*+ index(t) parallel(4) */ count(name) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.56

但是这种方式的分拆并不是真正意义的并行,因为其中的一部分是无法并行的,所以当我们进一步加大并行度的时候,执行时间反而变长了。

SQL> select /*+ index(t) parallel(4) */ count(*) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.17

而如果我们修改SQL语句,把原本的COUNT(NAME)改为COUNT(*),这时由于执行计划中回表部分不再需要,执行计划只剩下不能并行的索引扫描部分,因此执行计划又恢复了串行执行。这又一次证实了12c的并行索引扫描只是部分并行,其提升总体扫描效率的能力是有限的。

全表扫描的并行执行

下面看看全表扫描的并行执行:

SQL> select count(name) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.24

串行全表扫描时,执行时间为0.24秒。

SQL> select /*+ parallel(2) */ count(name) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.15

开启2路并行时,执行时间为0.15秒。

SQL> select /*+ parallel(4) */ count(name) from t_para_ind t where created >= to_date('201701', 'yyyymm');

Elapsed: 00:00:00.08

开启4路并行时,执行时间降低到了0.08秒。显然全表扫描才是真正的并行,在合理的数据量和资源消耗范围内,其执行时间是随着并行度增大而等比降低的。


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

近期文章

企业数据架构的云化智能重构和变革(含大会PPT)

警示2018:那些值得在年底彻查和回顾的数据库事件

Oracle研发总裁Thomas Kurian加盟Google Cloud

变与不变: Undo构造一致性读的例外情况

Oracle 18c新特性:动态 Container Map 增强

Oracle 18c新特性:Schema-Only 帐号提升安全性

Oracle 18c新特性:多租户舰队 CDB Fleet (含PPT)

为什么看了那么多灾难,还是过不好备份这一关?

入微:探究文档中找不到的12c并行索引扫描新特性相关推荐

  1. word文档中找不到服务器,【在WORD文件中插入excel表格,编辑保存后重新打开word文件并双击excel时提示“找不到服务器应用程序、源文件】excel整个表格不见了...

    为什么PPT插入EXCEL表格时显示无法找到服务器应用程序 这是由于excel或者ppt只能兼容.低版本的ppt和excel是无法打版本excel插入的表格的. 解决如下: 1.新建一个文本,将后缀名 ...

  2. knife4j或Swagger接口文档中找不到部分API文档

    由于今天遇到一个很奇怪的问题,我在sprintboot中建好了一个请求处理类,如下 /*** 企业信息表 控制器** @author AKAILEE* @since 2021-07-29*/ @Res ...

  3. 找出大文档中的所有手机号

    没有云山雾罩的技术名词,没有讳莫如深的互联网黑话:关注本专栏,IT技术不再深不可攀,技术细节小白也能读懂! 刚上班,小白就习惯性地打开淘宝,搜索特价打折商品.每天接听电话,传达文件这些无聊的工作他早就 ...

  4. 去掉图题注 空格_在Word 2010文档中为图表插入形如“图一,图二”的题注时,删除标签与编号之间自动出现的空格的最优操作方法是( )_学小易找答案...

    [判断题]矛盾有两个基本属性,一个是同一性另一个是特殊性. [单选题]小王利用Word撰写专业学术论文时,需要在论文结尾处罗列出所有参考文献或书目,最优的操作方法是( ). [单选题]"九层 ...

  5. 列表根据下标取值_散列表(上):Word文档中的单词拼写检查功能是如何实现的?...

    Word这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在Word里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误".Word的这个单词拼写 ...

  6. 用Aspose.Words for .NET动态生成word文档中的图片或水印

    1.概述 在项目中生成word文档,这个功能很普遍的,一般生成都是纯文字或是列表的比较多,便于客户打印,而要把图片也生成到word文档中的需求有些客户也是需要的,例如产品图片.这次我们介绍的是如何利用 ...

  7. 18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

    问题引入 在 Word 里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误",Word 文本编辑器的拼写检查功能是如何实现的呢?散列表(Hash Table) 散列表 散列 ...

  8. java poi操作word2007_java使用poi解析2007以上的word文档中的表格与图片

    项目中使用到了要解析word文档中的表格与图片,网上的2003的解析方式很多,2007以上的很少,我看了官网找了资料自己写了一个简单的解析方案,大家共同学习吧!有不对的地方希望大神指教! import ...

  9. 坐标定位手机元素_CSS 是如何影响浏览器元素在文档中的排列?

    之前在项目的过程中遇到了一个问题,某个 div 希望始终显示在最上面,而在之后的元素都显示在它之下,当时设置了 z-index 也没有效果,不知道什么原因,因此找了一下 CSS 相关资料,解决了这个问 ...

最新文章

  1. python中正确的表达式_python中如何正确使用正则表达式的详细模式(Verbose mode expression)...
  2. Spring MVC配置静态资源的正常访问
  3. 【windows7】解决IIS 80端口占用问题(亲测)
  4. 数据库-数据存储引擎
  5. 代码与html混合,自定义的标签与html的标签混合应用_css
  6. 如何在论文中自动生成标准的参考文献格式
  7. 2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树
  8. 【老杜】MySQL—day02
  9. ebnf范式_使用Scala基于词法单元的解析器定制EBNF范式文法解析
  10. Oracle In Memory最佳实践(附PPT和视频回放)
  11. (4.32)自定义函数整理大全
  12. 中国服务业发展的轨迹、逻辑与战略转变——改革开放40年来的经验分析
  13. [转]关于computer vision的会议及vision guys
  14. Parallels Desktop 17 for Mac虚拟机 v17.0.1 (51482)
  15. isis仿真软件怎么导入C语言,Proteus导入程序的操作方法
  16. Primer Premier 6.0 for Win 专业的引物设计
  17. window下ruby的下载与gem安装
  18. 回归分析——简单线性回归实例讲解(SPSS)
  19. Excel运用: Excel的窗口冻结与拆分
  20. 全媒体运营师胡耀文教你:教你从0到1,搭建直播电商的直播间模块

热门文章

  1. netflix 开源_手工3D打印机,Netflix上的开源等
  2. 美国 otc 数字货币_美国数字公共图书馆的免费藏书量是第一年的三倍
  3. (28)css3 3D转换
  4. JavaScript中forEach、for-in、for-of循环的比较
  5. Bootstrap 禁用某个菜单项
  6. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的实践-高斯牛顿法和曲线拟合
  7. 光驱怎么挂载第二个光驱_电脑光驱经常自己打开自己关闭,怎么回事
  8. python画图x轴丢值_python-从pyplot绘图中擦除先前绘制的内容
  9. python 常用包_七月在线—Python和数据分析Lesson 1
  10. python 第三方登录_【Python web 开发】social_django 集成第三方登录