简单视图合并

1 启发式查询转换

所有的启发式查询转换都是基于一套优化器内建的规则。在查询转换阶段,转换器会逐个针对这些规则对查询进行检查,确定其是否满足转换规则,一旦满足,转换器就对其进行转换。

1.1 简单视图合并

我们知道,视图(View)的实质就是一条查询语句。在解析阶段,语句中的每个视图都会被展开至一个查询块中。如果未做视图合并,优化器则会单独分析每个视图,并为定义视图的查询语句生成一个视图子计划。然后再分析整个查询的其他部分,并生成执行计划。在这种情况下,由于视图的执行计划和整体执行计划不是同时统一做评估的,因此其最终计划可能不是最优的执行计划。

使用视图合并技术后,优化器不再单独为每个视图生成子计划,而是将视图的查询合并到整体查询中去,最终为合并和整体查询寻找到一个最优的执行计划。要将视图查询合并到主查询中去,优化器会用视图所依赖的表的名字替换视图名字,并将视图查询中的WHERE条件合并到主查询的WHERE条件中去。

根据子查询在主查询中的位置以及其与主查询中所引用的表的关系的不同,子查询分为以下几种:

标量子查询(Scalar Subquery):出现在SELECT列表中的子查询称为标量子查询;

内联视图(Inline View):出现在FROM子句中的视图称为内联视图;

嵌套子查询(Nested Subquery):出现在WHERE子句中的子查询称为嵌套子查询;

互关联子查询(Correlated
Subquery):如果嵌套子查询是主查询WHERE条件的逻辑表达式的一部分(非IN、EXISTS子查询),并且嵌套子查询的查询条件中还包含主查询中表的字段,那么这样的子查询又称为互关联子查询。

提示:是否进行视图合并,可以由优化器参数_simple_view_merging或者提示MERGE/NO_MERGE控制,默认为TRUE。

视图合并又可以分为简单视图合并与复杂视图合并:

对于“选择—投影—关联”(Select-Project-Join)的视图的合并称为简单视图合并(Simple View
Merge),通常这种合并属于启发式查询转换,即只要视图合并特性被开启(_simple_view_merging=TRUE)都能被合并;

对于含有DISTINCT、GROUP BY的视图的合并称为复杂视图合并(Complex View
Merge),复杂视图合并通常属于基于代价的查询转换,最终是否合并取决于代价大小,因此我们将复杂视图合并放在下一节介绍。

当存在以下情况时,不能进行视图合并:

含有集合操作(UNION, UNION ALL, INTERSECT, MINUS)、聚集函数(AVG, COUNT, MAX, MIN,
SUM等)、ROWNUM和CONNECT BY的视图则不能被合并;

如果主查询语句中含有CURSOR表达式,则查询中的任何视图都不能被合并。

时间: 2024-08-10 23:19:29

简单视图合并的相关文章

Oracle查询转换之视图合并

一.简单视图合并:指针对那些不含外连接,以及所带视图定义sql语句中不含distinct,group by等聚合函数的目标sql的视图合并. create or replace view view_1 as SELECT t2.prod_id   FROM sales t2, customers t3  WHERE t2.cust_id = t3.cust_id    AND t3.cust_gender = 'M'; 视图合并:   SELECT t1.prod_id, t1.prod_nam

视图——让你的机房查询语句更简单

使用视图背景 刚开始做机房收费系统的时候师傅说过要用上视图.存储过程.触发器这些东西.当时没有太多的感觉,不知道什么时候该用,用到哪里.就在几天前因为在做关于两个表的查询语句时,就自己建立一个视图,然后查询出来结果,然后就成功了.我做的有点太简单了,在想是不是自己做错了.上网查了一下,看了一些博客.事实证明,它就是来简化数据库的操作,同时提高了速度. 视图简介: 视图是一张虚拟表,是存储在数据库中的查询的SQL语句,与此相关的数据并没有再存一份于数据库中.通过视图看到的数据仍然存放在基表中.视图

第四章 视图

创建视图 语法形式: create [algorithm = {undefined|merge|temptable}] view 视图名 [(属性清单)] as select语句 [with [cascaded|local] check option] 1.algorithm 可选参数,表示视图选择的算法 undefined表示自动选择 merge表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分吧取代语句的对应部分. temptable表示将视图的结果存入临时表,然后使用临时表执行

MVC分部视图

近期的项目一直在使用MVC,常常用到分部视图,下面就简单介绍一下分部视图. 使用分部视图最大的一个感受就是,整个页面颗粒化了,每个大页面都由这些小的颗粒组成,而且这些颗粒可以共享.大家的任务量便随之减轻了不少. 分部视图的优点: 1.   分部视图可以使系统插件化 . 2.   分部视图还可以带来一个优点,就是分工合作. 3.   分部视图还有一个在Mvc时代的优点,就是实现简单. 分部视图和视图的区别 视图有head.body标签,可以定义js,可以指定母板页,但是在我们用Vs右键添加 分部视

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会在比较差异 和应用补丁时帮助你应对这些修改.你将会在合并和追溯对话框中看到这些设置,它们同样也出现在TortoiseMerge 的设置中. 忽略行结束符 排除仅行结束符的差异. 比较空白 将所有缩进和行内空白差异视为增加/删除的行. 忽略空白修改 排除那些完全是针对空白数量或类型的修改,例如,修改缩

Oracle视图详解

转载自:http://blog.itpub.net/29785807/viewspace-1270120/ 一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的.视图只有逻辑定义.每次使用的时候,只是重新执行SQL. 视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中.那些用于产生视图的表叫做该视图的基表.一个视图也可以从另一个视图中产生. 视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中.通

Atitit 数据存储视图的最佳实际best practice attilax总结

1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应该优先使用视图2 1.3. 视图的缺点:复杂视图有时可能带来性能下降3 1.1. 视图优点:可读性的提升 视图的主要作用有以下几点:视点集中:使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务简化操作:,若视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句 定制数据:视图能够实现让不同的用户以不同的方式看到不同或相同的数据集 合并分割

MVC系列——MVC源码学习:打造自己的MVC框架(四:自定义视图)

前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾.对于这个系列,通过学习源码,博主也学到了很多东西,在此还是把博主知道的先发出来,供大家参考. 本文原创地址:http://www.cnblogs.com/landeanfen/p/6019719.html MVC源码学习系列文章目录: MVC系列——MVC源码学习:打造自己的MVC框架(一) MVC

DRF的视图和路由

DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个有什么不同呢~~~ urlpatterns = [     url(r'^book$', BookView.as_view()),     url(r'^book/(?P<id>\d+)$', BookEditView.as_view()), ] 我们可以看到,不管是View还是APIView最开始调用的都是as_view()方法~~那我们走进源码看看