关于查询转换的一些简单分析(三) (r3笔记第69天)
时间:2022-05-04
本文章向大家介绍关于查询转换的一些简单分析(三) (r3笔记第69天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关于查询转换,已经讨论了视图合并和子查询解嵌套,还有谓词推进和物化视图查询重写也是查询转换中不可或缺的部分。 -->谓词推进 这个术语听起来高大上,有点故弄玄虚的味道。其实在我们的查询中已经潜移默化的使用到了。 比如下面的这个查询。我们定义了一个子查询 v,然后在外部的过滤条件中加入了过滤条件e.deptno=10 因为e.deptno=v.deptno 所以过滤条件也可以理解为v.depetno=10
select e.ename,e.sal,v.avg_salary
from emp e,
(select deptno,avg(sal) avg_salary
from emp oe
group by deptno)v
where e.deptno=v.deptno and e.sal>1000
and e.deptno=10
Execution Plan
----------------------------------------------------------
Plan hash value: 269884559
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 117 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN | | 3 | 117 | 5 (20)| 00:00:01 |
| 2 | VIEW | | 1 | 26 | 2 (0)| 00:00:01 |
| 3 | HASH GROUP BY | | 1 | 7 | 2 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL| EMP | 3 | 21 | 2 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | EMP | 3 | 39 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("E"."DEPTNO"="V"."DEPTNO")
4 - filter("DEPTNO"=10)
5 - filter("E"."DEPTNO"=10 AND "E"."SAL">1000)
从上面的执行计划可以看到执行计划第2,3,4行是子查询v 相关的,第4行中的过滤条件,直接在子查询中嵌入了过滤条件depetno=10。 这种情况就是使用了谓词推进。 谓词推进在查询中都是自动调用的。但是如果碰到了rownum,算是它的死穴。我们来看看使用了rownum之后的执行计划。
select e.ename,e.sal,v.avg_salary
from emp e,
(select deptno,avg(sal) avg_salary
from emp oe where rownum<100
group by deptno )v
where e.deptno=v.deptno and e.sal>1000
and e.deptno=10
Execution Plan
----------------------------------------------------------
Plan hash value: 1823415238
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 351 | 6 (34)| 00:00:01 |
|* 1 | HASH JOIN | | 9 | 351 | 6 (34)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | EMP | 3 | 39 | 2 (0)| 00:00:01 |
|* 3 | VIEW | | 3 | 78 | 3 (34)| 00:00:01 |
| 4 | HASH GROUP BY | | 3 | 21 | 3 (34)| 00:00:01 |
|* 5 | COUNT STOPKEY | | | | | |
| 6 | TABLE ACCESS FULL| EMP | 14 | 98 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("E"."DEPTNO"="V"."DEPTNO")
2 - filter("E"."DEPTNO"=10 AND "E"."SAL">1000)
3 - filter("V"."DEPTNO"=10)
5 - filter(ROWNUM<100)
这个执行计划中,因为使用了rownum,所以就没有使用到谓词推进。 对于谓词推进也可以考虑使用hint push_pred来实现。 -->查询重写
对于物化视图有几个主要的两点用得比较多,查询重写和视图刷新。 查询重写在查询转换中还是比较实用的。如果有海量的数据,更新频率不高。可以根据查询条件来定义物化视图,开启查询重写的功能。 创建一个物化视图。
create materialized view mv_emp enable query rewrite
as
select e.ename,e.sal,v.avg_salary
from emp e,
(select deptno,avg(sal) avg_salary
from emp oe
group by deptno )v
where e.deptno=v.deptno and e.sal>1000
and e.deptno=10
然后使用查询,执行计划如下:
Execution Plan
----------------------------------------------------------
Plan hash value: 2244303076
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 99 | 2 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| MV_EMP | 3 | 99 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
- 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 数组属性和方法
- R语言使用倾向评分提高RCT(随机对照试验)的效率
- R语言调整随机对照试验中的基线协变量
- R语言用多重插补法估算相对风险
- R语言分析协变量之间的非线性关系
- stata如何处理结构方程模型(SEM)中具有缺失值的协变量
- stata对包含协变量的模型进行缺失值多重插补分析
- 互联网直播点播平台go语言搭建重定向和反向代理的区别及使用
- UNIX时间戳和北京时间的相互转换
- R语言对苏格兰独立民意调查的Meta分析
- 案例:归档自动清理脚本失效及连带影响
- R语言中固定与随机效应Meta分析 - 效率和置信区间覆盖
- R语言使用 LOWESS技术图分析逻辑回归中的函数形式
- R语言在逻辑回归中求R square R方
- R语言Poisson回归的拟合优度检验
- R语言ROC曲线下的面积-评估逻辑回归中的歧视