21 视图合并(view merge) --优化主题系列
2017-10-13 10:28
519 查看
视图合并(viewmerge)
当SQL语句中有内联视图(in-lineview,内联视图就是在from后面有select子查询)
或者SQL语句中有用 createview...创建的视图,CBO会将内联视图/视图给展开,进行等价的改写,这个过程就叫做视图合并。如果没有发生视图合并,在执行计划中,我们可以看到VIEW关键字。
select * from (select ... from x) a,b where
a.id=b.id;a就是内联视图
下面举个例子(基于SYSOracle11gR2):
有下面的SQL,其实这个SQL来自于我同事,他请求我优化:
SELECT to_char(wmsys.wm_concat(a.TABLE_NAME))
FROM user_tables a, dba_objects b
WHERE a.TABLE_NAME = b.OBJECT_NAME
AND b.OWNER = 'HBTELEPS'
ANDB.OBJECT_TYPE = 'TABLE';
user_tables 是不是被展开了??被展开了就叫视图合并
现在我们用HINTNO_MERGE
禁止USER_TABLES
进行视图合并
SELECT /*+ no_merge(a) */ to_char(wmsys.wm_concat(a.TABLE_NAME))
FROM user_tables a, dba_objects b
WHERE a.TABLE_NAME = b.OBJECT_NAME
AND b.OWNER = 'HBTELEPS'
AND B.OBJECT_TYPE = 'TABLE';
conn scott/tiger
create or replace view emp1 as select ename,job,deptno from empwhere sal>(select avg(sal) from emp);
select ename,job,dname,loc from emp1,dept whereemp1.deptno=dept.deptno;
没有VIEW关键字并且视图的名字也不见了就视图合并了
create or replace view emp1 as select ename,job,deptno from empwhere sal>(select avg(sal) from emp);
select ename,job,dname,loc from emp1,dept whereemp1.deptno=dept.deptno;
select ename, job, dname, loc
from (select ename, job, deptno
from emp
where sal >(select avg(sal) from emp)) emp1,
dept
where emp1.deptno = dept.deptno;
为什么可以进行视图合并??数学公式的等价转换
我很反对用大量的VIEW用了VIEW会出现性能问题
为什么 CBO要进行VIEWMERGE呢??
CBO认为把视图展开了能更好的进一步优化
因为如果不进行视图合并,那么这个视图就会当成一整块,在SQL执行过程中,这个视图就会被当成一个结果集,然后再去和别的表/结果集关联。如果进行了视图合并,那么这个视图就不会当成一整块了,它会被拆散,分开的执行。CBO通常情况下认为视图进行合并之后,性能较高,所以一般情况下都会发生视图合并。但是并不是每次进行了视图合并性能就高,所以我们在进行SQL优化的时候要特别留意视图合并。
请特别注意:当子查询/视图里面有
1.子查询有ROWNUM
2.子查询有CUBE,ROLLUP
3.子查询有UNION, UNION ALL
4. START WITH ,CONNECT BY
优化器可能就不会发生subqueryunnesting/view merge
这个时候就要改写SQL(比如把exists改写为in,notexists
改写为notin等等)
当SQL语句中有内联视图(in-lineview,内联视图就是在from后面有select子查询)
或者SQL语句中有用 createview...创建的视图,CBO会将内联视图/视图给展开,进行等价的改写,这个过程就叫做视图合并。如果没有发生视图合并,在执行计划中,我们可以看到VIEW关键字。
select * from (select ... from x) a,b where
a.id=b.id;a就是内联视图
下面举个例子(基于SYSOracle11gR2):
有下面的SQL,其实这个SQL来自于我同事,他请求我优化:
SELECT to_char(wmsys.wm_concat(a.TABLE_NAME))
FROM user_tables a, dba_objects b
WHERE a.TABLE_NAME = b.OBJECT_NAME
AND b.OWNER = 'HBTELEPS'
ANDB.OBJECT_TYPE = 'TABLE';
user_tables 是不是被展开了??被展开了就叫视图合并
现在我们用HINTNO_MERGE
禁止USER_TABLES
进行视图合并
SELECT /*+ no_merge(a) */ to_char(wmsys.wm_concat(a.TABLE_NAME))
FROM user_tables a, dba_objects b
WHERE a.TABLE_NAME = b.OBJECT_NAME
AND b.OWNER = 'HBTELEPS'
AND B.OBJECT_TYPE = 'TABLE';
conn scott/tiger
create or replace view emp1 as select ename,job,deptno from empwhere sal>(select avg(sal) from emp);
select ename,job,dname,loc from emp1,dept whereemp1.deptno=dept.deptno;
没有VIEW关键字并且视图的名字也不见了就视图合并了
create or replace view emp1 as select ename,job,deptno from empwhere sal>(select avg(sal) from emp);
select ename,job,dname,loc from emp1,dept whereemp1.deptno=dept.deptno;
select ename, job, dname, loc
from (select ename, job, deptno
from emp
where sal >(select avg(sal) from emp)) emp1,
dept
where emp1.deptno = dept.deptno;
为什么可以进行视图合并??数学公式的等价转换
我很反对用大量的VIEW用了VIEW会出现性能问题
为什么 CBO要进行VIEWMERGE呢??
CBO认为把视图展开了能更好的进一步优化
因为如果不进行视图合并,那么这个视图就会当成一整块,在SQL执行过程中,这个视图就会被当成一个结果集,然后再去和别的表/结果集关联。如果进行了视图合并,那么这个视图就不会当成一整块了,它会被拆散,分开的执行。CBO通常情况下认为视图进行合并之后,性能较高,所以一般情况下都会发生视图合并。但是并不是每次进行了视图合并性能就高,所以我们在进行SQL优化的时候要特别留意视图合并。
请特别注意:当子查询/视图里面有
1.子查询有ROWNUM
2.子查询有CUBE,ROLLUP
3.子查询有UNION, UNION ALL
4. START WITH ,CONNECT BY
优化器可能就不会发生subqueryunnesting/view merge
这个时候就要改写SQL(比如把exists改写为in,notexists
改写为notin等等)
相关文章推荐
- 12 排序合并连接(SORT MERGE JOIN)--优化主题系列
- Android视图优化之Merge,ViewStub基本使用
- MySQL5.7性能优化系列(二)——SQL语句优化(4)——使用合并、物化策略优化派生表、视图引用
- ios开发学习-弹出视图(Popup View) 效果源码分享--系列教程4
- ios开发学习-弹出视图(Popup View) 效果源码分享--系列教程2
- 解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑
- 解读ASP.NET 5 & MVC6系列教程(16):自定义View视图文件查找逻辑
- 【Android开发:UI优化系列一】ViewStub的实战开发
- 网页优化系列三:使用压缩后置viewstate
- NO_MERGE视图合并案例
- Android-布局优化(include , merge , ViewStub)
- 21-UIScrollView 滑动视图
- Android布局优化之ViewStub、include、merge使用与源码分析
- [Android学习系列21]webview的一些事
- ios开发学习-弹出视图(Popup View) 效果源码分享--系列教程2
- 28 分析函数优化自连接,减少表访问次数 --优化主题系列
- 21. Merge Two Sorted Lists (Java 合并有序链表 空间复杂度O(1))
- ASP.NET2.0状态管理系列(2) 视图状态ViewState和EnableViewState属性
- LeetCode 21. Merge Two Sorted Lists(合并链表)
- 微软BI 之SSIS 系列 - Merge, Merge Join, Union All 合并组件的使用以及Sort 排序组件同步异步的问题