视图合并和谓词推入

本文是《海量数据库解决方案》的读书笔记,主要探讨视图合并(View Merging)和谓词推入两种优化策略。通过视图合并,将读取查询与视图查询结合,减少数据处理量;谓词推入则在无法合并时,将查询条件推入到视图中,提高查询效率。内容包括不同类型的视图合并和谓词推入的实例分析,以及何时执行视图合并的标准和建议。

------------------------------《海量数据库解决方案》读书笔记-----视图合并(View Merging)------------------------

一、视图合并和谓词推入

1.视图查询分为两类: 视图查询和读取查询

         视图查询:创建视图时所使用的select语句,存储在数据字典中

         读取查询:执行该视图(或嵌套视图)的SQL语句。

2.嵌套视图:指视图在创建时的select语句中 from 后非表而是另一名select语句。

3.在读取查询时,为了对视图的最优读取,确保能从原始表中读取数据,实现方法有两种:

         *视图合并  view merging:          将视图查询与读取查询合并

         *谓词推入(查询条件推入)    Predicate Pushing: 在无法实现视图合并的条件下,将读取查询中的查询条件推入到视图查询中。

具体实现

1.类型1(视图合并):

         优化器将读取查询中所使用视图的名字替换为原始表名字,并将视图查询where条件中的查询条件添加到读取查询的where条件中。

如下:

-视图查询语句

create view emp_10(e_no,e_name,job,manager,hire_date,salary,

commission,deptno) as

select empno,ename,job,mgr,hiredate,sal,comm,deptno

from emp where deptno=10;

视图读取语句

select e_no,e_name,salary,hire_date

from emp_10

where salary > 1000000;

视图合并后:

select empno,ename,sal,hiredate

from emp

where deptno=10 and sal >1000000;

 

如果表中有deptno+sal的组合索引,转化之后的查询将可以直接使用该索引。有较好的执行计划。

 

2.类型2(谓词推入):

下面的情况下无法使用上面的方法,可以将读取查询的条件添加到视图中。

         集合运算(UNION,UNION ALL , INTERSECT,MINUS)

         CONNECT BY

         使用ROWNUM的情况

         SELECT-List中的统计函数(AVG,COUNT,MAX,MIN,SUM)

         GROUP BY (只有在使用了Merge提示或者相关参数为Enable的情况下才可以合并)

         SELECT-ListDISTINCT(只有在使用了Merge提示或者相关参数为Enable的情况下才可以合并)

-视图查询语句

create view emp_union_view(e_no,e_name,job,mgr,hiredate,sal,comm,deptno)

as select empno,ename,job,mgr,hiredate,sal,comm,deptno

from regular_emp

union all

select empno,ename,job,manager,hiredate,salary,comm,90 from temporary_emp;

 

视图读取语句

 

SELECT e_no, e_name, mgr, sal

FROM emp_union_view

WHERE deptno = 20;

 

视图合并后:

 

SELECT empno, ename, mgr, sal

FROM ( SELECT empno, ename, mgr, sal FROM regular_emp WHERE deptno = 20

UNION ALL

SELECT empno, ename, manager, salary FROM temporary_emp WHERE 90 = 20);

 

--书中这儿是90=20,我的理解是,union all下面一句中temporary_emp缺少deptno列,在建视图时,赋常量90,所以这列名也是90,继续阅读,确实如些:

“由于临时员工表没有部门编号列,所以为他们所指定的部门编号为90,因此就出现了在第二个SELECT查询语句中所出现的常量与常量进行比较的现象”

3.类型3GROUP BYDISTINCT类型的视图合并)

         视图转换的相关参数:

         _complex_view_merging,optimizer_secure_view_merging

         如果上面的参数设置为enabled,则即使在视图中使用了group bydistinct,读取查询中的查询条件也可以被添加到视图查询中去。

 

参数enabled下的例子:

 

-视图查询语句

CREATE VIEW emp_group_by_deptno

AS SELECT deptno, AVG(sal) avg_sal, min(sal) min_sal, MAX(sal) max_sal

FROM emp

GROUP BY deptno;

 

视图读取语句

 

SELECT *

FROM emp_group_by_deptno

WHERE deptno = 10;

 

视图合并后:

SELECT deptno, AVG(sal) avg_sal, MIN(sal) min_sal, MAX(sal) max_sal

FROM emp

WHERE deptno = 10

GROUP BY deptno;

4.视图合并的标准:

         如果在读取查询语句中存在大量可以缩减查询范围的查询条件,且将这些查询条件添加到视图中可以缩减整体的数据处理量,那么就有必要执行视图合并,反之就没有必要执行视图合并。

5.建议:

         建议将视图合并有关的参数设置为enabled,如果不需要视图合并,则使用提示"NO_MERGE"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值