(十二)数据库查询处理之Query Execution(1)
(十二)数据库查询处理之Query Execution(1)
1. 写在前面
- 这一大部分就是为了Lab3做准备的
- 每一个query plan都要实现一个next函数和一个init函数
对于next函数每次调用时,返回一个元组或空标记(如果没有更多元组
2. 迭代模型(ITERATOR MODEL)

对于上面这个图的理解就是获取所有的r.id然后构建hash表

然后在right的关系中获取出所有满足要求的S.ID
这里的evalPred(t)就等价于 S.value > 100
几乎所有的DBMS都是用上面的方法。但是允许我们流水线化的实现
不过一些操作必须是顺序化的如Joins、Order By
3. MATERIALIZATION 模型
一次处理所有输入,然后一次获得它的所有输出。

可以发现这种实现没有了next函数(可以把next理解成一种迭代器)
而是在一个list中放了所有满足要求的输入。然后最后也是获得所有输出
对于OLTP(主要是对数据的增删改)工作负载更好,因为一次访问少量元组。→降低执行/协调开销。→更少的函数调用。
Not good for OLAP(主要是对于大型数据的分析) queries with large intermediate results.
4. VECTORIZATION 模型
和上面模型的区别是这种模型用batch代替了全部

这种方法适合OLAP因为它大大减少了每个运算符的执行次数
5. 对于顺序扫描的优化
DBMS可以访问存储于table中的数据的最简单方法莫过于顺序扫描法
for page in table.pages:
for t in page.tuples:
if (check(t)):
// DO something
很显然这种方法不好。下面来看一些对于这个方法的简单优化
1. Zone MAPS
先维护一些关于这个page 的信息

对于这个page那们我们如果要执行
SELECT * FROM TABLE WHERE val > 500
我们就不用访问这个page了因为我们通过Zone Map 知道了这个page里最大的val为400.
2. LATE MATERIALIZATION
DBMS可以延迟拼接元组。到最上层的操作再进行元祖拼接

对于上面,这个操作而言我们进行一些分析
- 获取a表中满足要求的行号比如(0 ,1,3)并往上传递
- 获取b中在(0,1,3)行满足要求的行号比如(0,3)然后继续往上传递
- 在最上层元素我们就可以直接在c中的(0,3)行进行AVG操作
3. HEAP CLUSTERING
就是前面说过的聚簇索引。

6. index scan
- 多index scan

这个比较简单对于每一个索引根据条件获取一个集合。然后把集合结合起来最后根据另一个查询条件获得结果
2. INDEX SCAN PAGE SORTING
检索元组在非聚簇索引中是十分低效的
DBMS可以根据page id对于元组进行排序。这样就可以把我们随机访问变成顺序访问

7. EXPRESSION EVALUATION

当执行语句发生的时候。我们会有一个Execution Context的东西来保存我们的上下文
上下文中包含
当前元组
执行的参数
Table的Scheme
8.总结
- 相同的query plan 会有不同的执行方法
- 要尽可能多的利用index scan
- 表达式树虽然很直观但是非常慢
(十二)数据库查询处理之Query Execution(1)的更多相关文章
- [Java面试十二]数据库概念相关
1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的SQL语句,它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次. 允许更快执 ...
- Python3.5 学习十二 数据库介绍
MYSQL介绍: 主流三种数据库:Oracle.Mysql.Sqlserver Mysql安装和启动: windows 1安装 2启动服务 3进入bin目录,打开命令行 4 mysqladmin -u ...
- Hibernate(十二)Criteria查询
一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ...
- 跟我一起读postgresql源码(十二)——Executor(查询执行模块之——Materialization节点(下))
接前文,我们继续说剩下的4个Materialization节点. 7.SetOp节点 SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT.INTERSECT两种集合操作,至于另一种集合操 ...
- oracle学习笔记(十二) 查询练习(二) 高级查询
高级查询练习 /*--------------------------------------------- 分组查询 -------------------------------------*/ ...
- 50个SQL语句(MySQL版) 问题十二
--------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...
- m_Orchestrate learning system---三十二、数据库字段判断为空时容易出现问题,如何从根本上解决这个问题
m_Orchestrate learning system---三十二.数据库字段判断为空时容易出现问题,如何从根本上解决这个问题 一.总结 一句话总结:字段禁止为空,设置默认值0即可 禁止 空 默认 ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- 工程师技术(二):postfix基础邮件服务、postfix空客户端邮件服务、搭建mariadb数据库系统、配置一个数据库、使用数据库查询
一.postfix基础邮件服务 目标: 本例要求在虚拟机server0上配置 postfix 基础服务,具体要求如下: 1> 监听本机的所有接口 2> 将邮件域和邮件服务主机名都改为 ...
随机推荐
- switch表达式为字符串
package EXERCISE; import java.util.*; public class HashCode { //switch判断字符串.switch表达式byte,short,int, ...
- F - Courses (学生选课(匈牙利算法模板))
题目大意:一共有N个学生跟P门课程,一个学生可以任意选一门或多门课,问是否达成: 1.每个学生选的都是不同的课(即不能有两个学生选同一门课) 2.每门课都有一个代表(即P门课都被成功选过) 输入为: ...
- Codeforces Round #684 (Div. 2)【ABC1C2】
比赛链接:https://codeforces.com/contest/1440 A. Buy the String 题解 枚举字符串中 \(0\) 或 \(1\) 的个数即可. 代码 #includ ...
- AtCoder Beginner Contest 170
比赛链接:https://atcoder.jp/contests/abc170 A - Five Variables 题意 $5$ 个数中有 $1$ 个 $0$,判断是第几个. 代码 #include ...
- Codeforces Round #649 (Div. 2) A. XXXXX
题目链接:https://codeforces.com/contest/1364/problem/A 题意 找出大小为 $n$ 的数组 $a$ 的最长连续子数组,其元素和不被 $x$ 整除. 题解 如 ...
- Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) C. Division (数学)
题意:有两个数\(p\)和\(q\),找到一个最大的数\(x\),使得\(p\ mod\ x=0\)并且\(x\ mod\ q\ne 0\). 题解:首先,如果\(p\ mod\ q\ne0\),那么 ...
- hdu2126 Buy the souvenirs
Problem Description When the winter holiday comes, a lot of people will have a trip. Generally, ther ...
- 牛客练习赛71 C.数学考试 (DP,容斥原理)
题意:RT 题解:先对\(p\)排个序,然后设\(dp[i]\)表示前\(i-1\)个\(p[i]\)满足条件但是\(p[i]\)不满足,即在\([1,p[i]]\)中不存在从\(p[1]\)到\(p ...
- JavaScript——七(继承)
一. 这个样子这个student的类型是person,这个样子写虽然继承了,但是是把父类的属性继承在了student的原型上 为了使student的类型改成他自己就需要加一句"student ...
- Python 读Excel数据
一.读取Excel数据的步骤及方式: 1.打开Excel文件 data = xlrd.open_workbook(r'D:\Interface_test\test_data\测试用例.xlsx') 2 ...