子查询优化 - Hyper
Unnesting Arbitrary Queries - T Neumann, A Kemper
The Complete Story of Joins (in HyPer) - Thomas Neumann, Viktor Leis, Alfons Kemper
Unnesting Arbitrary Queries
如其名,这篇paper讲的就是如何unnesting
看个简单的例子,这里称相关子查询为,dependent join
经过unnesting后得到下面的SQL
可以看到,unnesting的过程就是,把where中的标量子查询,放到from中成为一个derived table
所有的unnesting的思路,基本都是如此,把依赖外部的参数提出,剩下独立的sql生成临时derived table,然后再和外部的表进行join
定义
先给出inner join 的定义,
inner join就是对笛卡尔积,cross product,的一个selection
接着定义,dependent join,
从公式中看出,T2是个function,t2是T2(t1)的输出结果,同时结果还需要满足selection p
这里叫join有些confuse,微软定义为apply算子跟容易理解些
Unnesting
这里以TPCH-21为例子,
这里把selection上提,消除了l2的参数,转化为regular join
为什么把selection上提是合理的?
有selection的时候,对满足的条件的row执行sql,所以把selection上提后,就是对全量row执行sql
得到的结果是原来的超集
然后在外层再通过selection过滤,效果上是等价的
General Unnesting
上面只是一个例子,那么对于general的场景下,如何进行unnesting?
首先做一步转换,
D是个T1的子集,仅仅包含T2所需要的参数列的distinct
这样做的好处是,D是一个远小于T1的表,尤其如果T1的参数列有大量的重复的话
T2原先需要对T1的每一行都apply,但是现在只需要对distinct后的行
所以这里就把一个dependent join,转化成一个nicer的dependent join和一个regular join
以这个sql为例,
可以看出这个转换是等价的
再者,需要消除Dependent Join
消除的条件如下,
当D的输出列和T的参数列不相交的时候,就可以转化为regular join
如果不满足的,就需要用下面的公式去转换,
Selection
前面已经解释了,为什么selection上提是合理的
Join
对于inner join,本身是有交换和结合率的,所以可以简单的把和D没有依赖的join先提出
如果两边都依赖D的话,需要将D复制一份,分别和两个进行Dependent Join
同样对于Outer Join和Semi Join这种不支持交换率的情况,也需要复制D
GroupBY
GroupBy在上提后,会需要加上join key
Projection
根据这些规则,消除的过程如下,
上提GroupBy,按照规则,上提后, group by的column加上d.id
上提selection
此时,dependent join的左右已经不相干,
所以将dependent join转换为regular join
把selection下推到join上
The Complete Story of Joins (in HyPer)
主要介绍两种特殊的Join算子,
Single Join
对于下面的Sql,
子查询如果返回不止一条结果,需要报错
这就是需要加上Max1Row
而SingleJoin把Max1Row集成到算子内部,
Mark Join
看下这条Sql,
子查询后面有个or,Disjunction predicates
这样如果直接转成semi-join会有问题,因为那些可能满足or Sabbatical = true的行在join的时候会被筛选掉,上面拿不到
所以一个自然的想法就是,我们在join的时候不去筛选数据,把数据都保留下来,只是给每行打标,true,false,null
可以看到Mark Join的定义,多出一个m,用于标记是否满足join条件
因为Mark join没有筛选行,所以在最外层,我们可以自由的通过projection来挑选数据,
这里会选m为true,或者Sabbatical=true的行
MarkJoin在对null值的处理上也会很方便
子查询优化 - Hyper的更多相关文章
- 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)
原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ...
- 标量子查询优化(用group by 代替distinct)
标量子查询优化 当使用另外一个SELECT 语句来产生结果中的一列的值的时候,这个查询必须只能返回一行一列的值.这种类型的子查询被称为标量子查询 在某些情况下可以进行优化以减少标量子查询的重复执行,但 ...
- PostgreSQL查询优化之子查询优化
子查询优化 上拉子连接 上拉子连接主要是把ANY和EXIST子句转换为半连接 void pull_up_sublinks(PlannerInfo *root) { Node *jtnode; //子连 ...
- postgresql子查询优化(提升子查询)
问题背景 在开发项目过程中,客户要求使用gbase8s数据库(基于informix),简单的分页页面响应很慢.排查发现分页sql是先查询出数据在外面套一层后再取多少条,如果去掉嵌套的一层,直接获取则很 ...
- MySQL实验 子查询优化双参数limit
MySQL实验 子查询优化双参数limit 没想到双参数limit还有优化的余地,为了亲眼见到,今天来亲自实验一下. 实验准备 使用MySQL官方的大数据库employees进行实验,导入该示例库 ...
- Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化
参考书籍<mysql是怎样运行的> 非常推荐这本书,通俗易懂,但是没有讲mysql主从等内容 书中还讲解了本文没有提到的子查询优化内容, 本文只总结了常见的子查询是如何优化的 系列文章目录 ...
- 由一条sql语句想到的子查询优化
摘要:相信大家都使用过子查询,因为使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,比较灵活,我也喜欢用,可最近因为一条包含子查询的select count(*)语句导致点开管理系 ...
- mysql 子查询优化
今天用到要查询七天内都没有装机的门店信息,首先想到了用not in,先把装机的userid查出来,然后再id not in,但是这样就必须使用子查询,数据量少还可以,数据量大了的话,肯定效率特别低,因 ...
- MySQL子查询优化实例
优化:子查询改写成关联查询 线上遇到问题,查询较慢,如为对应SQL的查询执行计划: localhost.\G . row *************************** id: select_ ...
随机推荐
- iOS多线程GCD简介(一)
之前讲过多线程之NSOperation,今天来讲讲代码更加简洁和高效的GCD.下面说的内容都是基于iOS6以后和ARC下. Grand Central Dispatch (GCD)简介 Grand C ...
- 深入理解JVM-内存溢出案例演示与分析
1.java堆溢出 思路:Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存 ...
- plsql连接数据库后备注乱码|plsql连接数据库后中文乱码
-- 背景:连接开发库后查阅单表备注信息时发现所有的备注都显示为"???????". -- 解决方案: -- (1). 首先先确认数据库的编码格式字符集,查询数据库编码格式. -- ...
- USB之hub3
============= 本系列参考 ============= <圈圈教你玩USB>.<Linux那些事儿之我是USB> 协议文档:https://www.usb.or ...
- Centos7源码部署apache/httpd服务
httpd:是一个提供网站服务的程序 监听端口:80 环境准备: Linux CentOS7.3系统 使用一台服务端,一台客户端即可: 一.安装httpd 1:安装 [root@localhost ~ ...
- MySQL/MariaDB数据库的事务和隔离级别
MySQL/MariaDB数据库的事务和隔离级别 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务概述 1>.事务Transactions 一组原子性的SQL语句 ...
- subprocess模块的使用注意
subprocess.Popen()函数 语法格式: subprocess.Popen(arg,stdin=None,stdout=None,stderr=None,shell=False) 1.主要 ...
- linux下载安装常用的配置,jdk,mysql,tomcat,redis
1.特别强调,本教程适合于VMware Workstation创建的虚拟机linux配置. 2.ssh---linux连接的工具 https://pan.baidu.com/s/1MGIr5WOkkH ...
- vscode——如何对MarkDown文件进行预览
前言 一般都是用Typora直接进行编写了,今天恰好在vs中写完代码,就需要编辑文档,这里就记录下如何预览吧 步骤 ctrl+shift+p打开命令面板,然后输入markdowm->选择在侧边打 ...
- MySQL之自连接
自连接就是说,在同一个表中,看做是两个表,下表表示 找每个人的领导,如果没有领导,显示无领导,eid 对应 leaderid,请看员工表 mysql> select * from emp; +- ...