当前位置: 首页 > news >正文

备案期间 需要关闭网站吗包装设计与制作

备案期间 需要关闭网站吗,包装设计与制作,wordpress改了固定链接,网络平面广告设计背景 在默认配置下,若查询语句中嵌入了视图,系统会先等待视图内部所包含的查询完全执行完成后,再继续执行父查询。这种方式造成优化器无法将视图查询与外层查询视为一个整体来进行优化处理,从而限制了优化效果。因此,…

背景

在默认配置下,若查询语句中嵌入了视图,系统会先等待视图内部所包含的查询完全执行完成后,再继续执行父查询。这种方式造成优化器无法将视图查询与外层查询视为一个整体来进行优化处理,从而限制了优化效果。因此,Oceanbase数据库特别引入了视图合并机制,该机制能够将视图中的查询逻辑整合到父查询之中,从而进一步提升优化器的优化效果。

视图合并的基本原理

视图合并规则主要包含对以下两种情况的处理:

  1. from视图合并:将from子句中涉及的视图与父查询合并,消除视图查询。
  2. semi join视图合并:将semi join子句中涉及的视图与父查询合并,消除视图查询。

from视图合并

考虑如下情况:

SELECT t1.c1, v.c2, v.c3 FROM (SELECT t2.c2, t3.c3 FROM t2, t3 WHERE t2.c1 = t3.c1) v, t1, WHERE t1.c1 = v.c1

上述例子在默认情况下,只能严格按照视图的定义进行join操作,优化器无法对连接顺序进行优化。可以考虑将视图查询与父查询合并,如下所示:

SELECT t1.c1, t2.c2, t3.c3 FROM t1, t2, t3 WHERE t1.c1 = t2.c1 AND t1.c1 = t3.c1

semi join 视图合并

考虑如下情况:

SELECT t1.c1 FROM t1 LEFT SEMI JOIN (SELECT c1 FROM t2) v WHERE t1.c1 = v.c1

上述情况下中的视图为简单查询,本身没有实际意义,可以考虑通过合并消除视图,如下所示:

SELECT t1.c1 FROM t1 LEFT SEMI JOIN t2 WHERE t1.c1 = t2.c1

代码解析

视图合并规则的入口为ObTransformViewMerge::transform_one_stmt,该函数的主要执行流程如下:

  1. 调用transform_in_from_item函数执行from视图合并。
  2. 调用transform_in_semi_info函数执行semi join视图合并。

from视图合并

transform_in_from_item会遍历父查询在from子句中使用的表,然后根据表的类型分别执行合并操作,如下所示:

  1. 调用transform_joined_table函数对通过join操作连接起来的多个表形成的逻辑表执行视图合并。
  2. 调用transform_generated_table函数对视图表执行视图合并。

transform_joined_table函数会递归遍历join树直到叶子节点的基表或视图,然后调用transform_generated_table函数(与上面提到的函数为重载函数)执行视图合并。

在join树的视图合并的过程中涉及到一个问题,即视图中的where条件要放置在父查询的where还是join条件中,可以分为以下几种情况:

  1. 视图及所有父节点始终位于join树中外连接的外表一侧(left join的左侧或者right join的右侧),此时应该将where条件提取到父查询中。
  2. 视图及所有父节点始终位于join树中外连接的内表一侧(left join的右侧或者right join的左侧),此时应该将where条件提取到join条件中。
  3. 视图的某个父节点位于外连接的内表一侧,而视图位于外连接的外表一侧,此时如果视图中包含where条件,则无法完成改写。

下面对上述几种情况分别举例说明:

情况1,考虑如下查询:

SELECT * FROM t1 RIGHT JOIN (t2 RIGHT JOIN (SELECT * FROM t3 WHERE c2 <> 0) v ON t2.c1 = v.c1)ON t1.c1 = t2.c1

根据join的语义,可以将上述查询进行如下改写:

SELECT * FROM t1 RIGHT JOIN (t2 RIGHT JOIN t3 ON t2.c1 = v.c1)ON t1.c1 = t2.c1 WHERE t3.c2 <> 0

情况2,考虑如下查询:

SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN (SELECT * FROM t3 WHERE c2 <> 0) v ON t2.c1 = v.c1)ON t1.c1 = t2.c1

根据join的语义,可以将上述查询进行如下改写:

SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.c1 = t3.c1 AND t3.c2 <> 0)ON t1.c1 = t2.c1

情况3,考虑如下查询:

SELECT * FROM t1 LEFT JOIN (t2 RIGHT JOIN (SELECT * FROM t3 WHERE c2 <> 0) v ON t2.c1 = v.c1)ON t1.c1 = t2.c1

根据join的语义,如果按照情况1将where条件提取到父查询中,则该条件成为空值拒绝条件,父查询会被转换为内连接,与原始查询语义不符;如果按照情况2将where条件提取到join条件中,按照外连接的语义,也与原始查询语义不符。因此对于这种情况,无法完成改写。

同理,如果视图位于full join中且包含where条件,同样无法完成改写,这里不再进一步举例。

transform_generated_table函数有两个版本,分别负责对单视图执行合并以及对join树中的视图进行合并。该函数会调用check_can_be_unnested函数视图判断是否可以被合并,如果可以,则调用do_view_merge_transformation函数执行合并。

对于参与外连接的视图,如果视图位于left join的右侧或者right join的左侧以及full join的任意一侧,且视图中存在不满足空值传递的select表达式,则不能将select表达式直接合并到父查询中。

考虑如下情况:

SELECT * FROM t1 LEFT JOIN (SELECT 1, * FROM t2) vON t1.c1 = t2.c1

对于视图中的常量表达式,当t2中的列为null,其结果不会受到影响也变为null,因此如果将其直接合并到父查询,则与外连接的语义不符。为此我们可以选择一个t2中的非空列c2,然后进行如下改写:

SELECT t1.*, case t2.c2 when IS NOT NULL then 1 else NULL, t2.*FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1

check_can_be_unnested函数负责判断视图是否可以被合并。如果视图属于上述例子的情况,该函数会按照如下顺序找到一个非空列:

  1. 如果join条件中存在视图结果的某一列的空值拒绝条件,意味着在连接之前视图表中该列的空值均已被过滤,因此选择该列作为非空列。
  2. 如果视图查询的列中存在满足非空约束的列,则选择该列作为非空列。
  3. 如果上述条件都不满足,则选择视图查询表的主键作为非空列。

do_view_merge_transformation函数负责将视图与父查询合并,该函数的逻辑比较简单,主要是将视图查询涉及的信息更新到父查询中,这里不再赘述。

semi join视图合并

transform_in_semi_info函数负责将semi join子句中的视图与父查询进行合并,该函数会遍历父查询的semi join信息,然后调用check_semi_right_table_can_be_merged函数判断视图是否可以被合并。如果可以,则调用do_view_merge_for_semi_right_table函数执行合并。

do_view_merge_for_semi_right_table函数负责将semi join涉及的视图合并到父查询,该函数的逻辑比较简单,主要是将视图查询涉及的信息更新到父查询中,这里不再赘述。


http://www.yayakq.cn/news/348094/

相关文章:

  • 怎么做才能设计出好的网站网站栏目结构
  • 网站集约化建设意见工程建设造价全过程监督网站
  • 慧聪网网站建设策略网站负责人彩色验照
  • 泰国网站的域名简述商务网站建设
  • 建设银行网银网站激活厦门市建设执业资格管理中心网站
  • 购物网站建设开发php 数据库转wordpress
  • 做pc和移动网站的适配免费可商用的cms
  • 大庆企业做网站河北邯郸有什么好玩的地方
  • 双流建设局网站南京专业做网站的公司
  • 网站主关键词如何优化成都装修网站制作
  • 网站常见问题是什么广州市几个区
  • 做网站的荣誉证书天猫商城官方网站
  • 长春哪有做网站公司如何做双版网站
  • 免费cms建站系统有哪些山东省优质校建设网站
  • 初期做网站怎么自己编程做网站
  • 网页设计师职位要求萌新seo
  • 没有网站可以做seo排名吗做微商能利用的网站有哪些问题
  • 做资金盘网站违法吗中国500强企业排名
  • 用户研究网站兰州网站搜索引擎优化
  • 简洁大气的网站设计dw网站开发环境
  • 网站建站时间包头市做网站公司
  • 如何开办网站商标注册号
  • 辽宁省交通投资建设集团网站怎么做表格
  • 株洲电商网站建设上海国际人力资源开发公司
  • 展览中心网站建设课桌公司网站建设
  • 邢台天九建设有限公司网站云南昆明百度推广公司
  • 企业网站html模板优秀网站建设公司
  • 沈阳网站建设定制WordPress文章可视化php代码
  • h5做的网站国外vps
  • 深圳网站建设行吗字体设计网