一个关于执行计划的小问题测试(r8笔记第60天)
最近有朋友在微信公众号后台留言提了一个问题,问题如下: 执行计划中,并列的两条操作比如并列的两条table access full,上层没有关联操作比如hash join,这是什么意思?
但是两张表在sql中是有等值连接的,为什么执行计划没有提现连接方式呢? 然后他过了一会附了一张操作截图。
这个问题一下子看起来就比较清晰了。
为了简单复现这个问题,在本地做了一个小测试。 为了达到同样的表结构,我创建了同样的表。 create table by_fs as select object_id zd_fs, object_name kecheng from all_objects where rownum<11; create table xs_xf as select object_id zd_fs, object_name kecheng from all_objects where rownum<20; 然后启用trace,得到的执行计划情况如下:
可以看到是可以复现这个朋友的问题的。这个时候从执行计划来入手,看到对于表XS_XF走了全表扫描,对于其中的数据在表BY_FS中通过全表扫描进行匹配。
整个执行计划的关键可以看到谓词信息:
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("CC"."KECHENG"=:B1)
在by_fs中,会把外层xs_xf的查询结果通过绑定变量的方式传入,感觉其实和表关联的方式应该是一样的情况。
而如果改为表连接的场景,可以轻松实现。改写为下面的形式继续查看。
这个时候可以看到对这两个表还是走了全表扫描,表连接为hash join的方式,可以看到一致性读也确实低了不少。
这个地方为什么看到的是hash join,还是通过谓词信息来看。
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("CC"."KECHENG"="AA"."KECHENG")
目前两个表还是没有任何索引的,但是通过谓词信息可以看到access的字样,可见是在数据库内部做了这一层的映射,把两个表的数据通过hash算法进行映射。
我们接着创建索引。
create index ind_xs_xf on xs_xf(kecheng);
create index ind_by_fs on by_fs(kecheng);
还是使用最开始的sq
可以看到CBO还是做了很合理的选择,对于xs_xf还是使用全表扫描,对于返回的结果集,是通过绑定变量的方式传入子查询。 我们更近一步,来看看修改为表关联的方式,执行计划的变化。
这种结果就好比下面的形式。
select kecheng,zd_fs from by_fs order by kecheng;
select * from xs_xf order by kecheng;
针对本例,是对by_fs做了全表扫描,对数据进行了排序,然后根据kecheng对结果集进行了匹配和关联,最后把结果集输出。
因为merge-sort join确实使用情况会相对比较少,在数据库中是存在一个隐含参数来控制的。
NAME VALUE ISDEFAULT ISMOD ISADJ
------------------------------------------ --------- ---------- -----
_optimizer_sortmerge_join_enabled TRUE TRUE FALSE FALSE
当然也可以通过Hint /*+use_merge(cc,aa)来进行控制和管理。
当然更多的信息没有进行挖掘,不过从我的直观感受来看,第一个查询的效果和表关联的场景还是很类似的。而且通过CBO来做出的最终判定来看,差别很明显,但是效果基本是一致的。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Javaweb鼠标事件案例分析—鼠标移入移出表格颜色变化
- docker registry V2私有仓库搭建
- Python 路径问题:cv2.error: OpenCV(4.1.0)...size.width>0 && size.height>0 in function 'cv::imshow'. 原因与解决
- 算法案例分析—字符串模式匹配算法
- Docker-软件工程集装箱技术
- PyQt5 技术篇-获取电脑屏幕桌面的宽、高和分辨率
- 使用Python快速抠图
- 值得白嫖的数据库常用操作语句汇总(数据库、数据表、数据操作)
- JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
- 初入编程吓破胆?那是你还不懂这些!(高能预警)
- 振兴杯试题功能设计(准备)
- PyQt5 技术篇-Dialog窗口增加?问号按钮
- python课题:正弦函数 求圆形的阴影面积
- 华为学习笔记(SSM框架报错篇)
- Python通讯录作业