关于查询转换的一些简单分析(三)

关于查询转换,已经讨论了视图合并和子查询解嵌套,还有谓词推进和物化视图查询重写也是查询转换中不可或缺的部分。
-->谓词推进
这个术语听起来高大上,有点故弄玄虚的味道。其实在我们的查询中已经潜移默化的使用到了。
比如下面的这个查询。我们定义了一个子查询 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
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

 这个执行计划中,因为使用了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)

 

时间: 2024-07-30 10:52:23

关于查询转换的一些简单分析(三)的相关文章

关于查询转换的一些简单分析(二)

关于查询转换的作用,在之前的一篇博文里面也大概说了视图合并和子查询嵌套的部分.http://blog.itpub.net/23718752/viewspace-1310272/ 今天来举一个实例来分析一下. 这条sql语句是在生产环境中运行的,目前执行速度在0.1秒左右.我们来看看从查询转换的角度来看,对于同一条sql语句,反复的变化就能够折腾出不少的东西来. sql语句如下: select soc   from SERVICE_DETAILS ser  --大表,数据量过亿,做了分区 wher

关于查询转换的一些简单分析(一)

在sql解析器中,在生成执行计划的时候,会在多个执行计划中选择最优的计划,在这个过程中,查询转换就是一个很重要的过程. 虽然最终的执行结果没有变化,但是从优化器的角度来看,查询转换的结果会更好. 大体来说查询转换有以下几种类型.视图合并子查询解嵌套谓词推进物化视图查询重写 比如 select *from emp where deptno in (select deptno from dept) 会在查询转换中转换为下面的样子. select e.* from emp e,dept d where

一次由查询转换引起的性能问题的分析

在优化器进行查询转换的时候,如果将内嵌视图里推入连接谓词,视图里的结果集会更小,优化器就有可能会选择Nested Loops Join 与 Index Range Scan 的方式加快数据的显示.但如果内嵌视图中存在GROUP BY,此时会发生什么情况?在10g和11g里面,Oracle的处理方式有哪些不同? 问题分析 为了解答以上问题,首先需要对SQL的基本语法与查询转换(QueryTransformation)的概念与原理有一定了解. Oracle优化器可以分为下面两种: Logical O

XML实现异构数据库间转换的实现与分析(转)

xml|数据|数据库|转换 XML实现异构数据库间转换的实现与分析 类型: XML/Biztalk 收录时间: 2002-4-8 9:20:00 XML中一种扩展的标记语言,它具有很好的扩展性标记.本文通过XML实现不同数据库的定义,实现对XML数据库的访问和异构数据库之间的互访.   关键词:XML  异构数据库  信息交换  数据库访问  1  引言   XML(Extensible  Markup  Language)它是由W3C组织于1998年2月  制定的一种通用语言规范,是SGML 

Oracle CBO几种基本的查询转换详解

Oracle CBO几种基本的查询转换详解 查询转换(Query Transformation),又称为逻辑优化(Logical Optimization),也称为软优化,即查询转换器在逻辑上对语句做一些语义等价转换,从而能使优化器生成效率更高的执行计划. 语句在被提交到Oracle后,解析器(Parser)会对SQL语句的语法.语义进行分析,并将查询中的视图展开.划分为小的查询块(Query Block).它们是嵌套或者相互关联的,而查询形式则决定了它们之间是如何关联的.这些查询块被传送给了查

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一3.1 启发式查询转换

3.1 启发式查询转换 所有的启发式查询转换都是基于一套优化器内建的规则.在查询转换阶段,转换器会逐个针对这些规则对查询进行检查,确定其是否满足转换规则,一旦满足,转换器就对其进行转换. 3.1.1 简单视图合并 我们知道,视图(View)的实质就是一条查询语句.在解析阶段,语句中的每个视图都会被展开至一个查询块中.如果未做视图合并,优化器则会单独分析每个视图,并为定义视图的查询语句生成一个视图子计划.然后再分析整个查询的其他部分,并生成执行计划.在这种情况下,由于视图的执行计划和整体执行计划不

性能优化之查询转换 - 子查询类

子查询,是SQL中常见的一种写法.对于优化器来说,子查询是较难优化的部分.Oracle提供了多种方式,对子查询进行查询转换. 一.子查询推进 子查询推进(又称子查询推入)是指优化器将子查询提前进行评估,使得优化器可以更早地介入优化以获得更优质的执行计划.这个技术可以通过提示PUSH_SUBQ/NO_PUSH_SUBQ控制.下面通过一个示例看看结果. SQL> create table t_users as select * from dba_users; //表已创建 SQL> create

一条SQL语句查询块分解及查询转换

原始语句如下: select BIZ_NO,        OUT_BIZ_NO,        ORDER_NO,        USER_ID,        user_name,        CARD_NO,        ACCOUNT_NO,        ACCOUNT_BIZ_NO,        USER_TYPE,        EVENT,        GID,        TRADE_AMOUNT,        DATA_BIZ_TYPE,        DIREC

jquery的相关内容:jquery的简单分析

文章简介:jquery原理的简单分析,扒开jquery的小外套. 引言 最近LZ还在消化系统原理的第三章,因此这部分内容LZ打算再沉淀一下再写.本次笔者和各位来讨论一点前端的内容,其实有关jquery,在很久之前,LZ就写过一篇简单的源码分析.只不过当时刚开始写博客,写的相对来讲比较随意,直接就把源码给贴上来了,尽管加了很多注释,但还是会略显粗糙. 这次LZ再次执笔,准备稍微规范一点的探讨一下jquery的相关内容. jquery的外衣 jquery是一个轻量级的JS框架,这点相信大部分人都听过