------------------------------《海量数据库解决方案》读书笔记-----视图合并(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-List的DISTINCT(只有在使用了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.类型3(GROUP BY或DISTINCT类型的视图合并)
视图转换的相关参数:
_complex_view_merging,optimizer_secure_view_merging
如果上面的参数设置为enabled,则即使在视图中使用了group by或distinct,读取查询中的查询条件也可以被添加到视图查询中去。
参数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"
本文是《海量数据库解决方案》的读书笔记,主要探讨视图合并(View Merging)和谓词推入两种优化策略。通过视图合并,将读取查询与视图查询结合,减少数据处理量;谓词推入则在无法合并时,将查询条件推入到视图中,提高查询效率。内容包括不同类型的视图合并和谓词推入的实例分析,以及何时执行视图合并的标准和建议。

1844

被折叠的 条评论
为什么被折叠?



