(十二)数据库查询处理之Query Execution(1)

1. 写在前面

  1. 这一大部分就是为了Lab3做准备的
  2. 每一个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可以延迟拼接元组。到最上层的操作再进行元祖拼接

对于上面,这个操作而言我们进行一些分析

  1. 获取a表中满足要求的行号比如(0 ,1,3)并往上传递
  2. 获取b中在(0,1,3)行满足要求的行号比如(0,3)然后继续往上传递
  3. 在最上层元素我们就可以直接在c中的(0,3)行进行AVG操作

3. HEAP CLUSTERING

就是前面说过的聚簇索引。

6. index scan

  1. 多index scan

这个比较简单对于每一个索引根据条件获取一个集合。然后把集合结合起来最后根据另一个查询条件获得结果

2. INDEX SCAN PAGE SORTING

检索元组在非聚簇索引中是十分低效的

DBMS可以根据page id对于元组进行排序。这样就可以把我们随机访问变成顺序访问

7. EXPRESSION EVALUATION

当执行语句发生的时候。我们会有一个Execution Context的东西来保存我们的上下文

上下文中包含

当前元组
执行的参数
Table的Scheme

8.总结

  1. 相同的query plan 会有不同的执行方法
  2. 要尽可能多的利用index scan
  3. 表达式树虽然很直观但是非常慢

(十二)数据库查询处理之Query Execution(1)的更多相关文章

  1. [Java面试十二]数据库概念相关

    1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的SQL语句,它的优点有:     允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次.     允许更快执 ...

  2. Python3.5 学习十二 数据库介绍

    MYSQL介绍: 主流三种数据库:Oracle.Mysql.Sqlserver Mysql安装和启动: windows 1安装 2启动服务 3进入bin目录,打开命令行 4 mysqladmin -u ...

  3. Hibernate(十二)Criteria查询

    一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ...

  4. 跟我一起读postgresql源码(十二)——Executor(查询执行模块之——Materialization节点(下))

    接前文,我们继续说剩下的4个Materialization节点. 7.SetOp节点 SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT.INTERSECT两种集合操作,至于另一种集合操 ...

  5. oracle学习笔记(十二) 查询练习(二) 高级查询

    高级查询练习 /*--------------------------------------------- 分组查询 -------------------------------------*/ ...

  6. 50个SQL语句(MySQL版) 问题十二

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  7. m_Orchestrate learning system---三十二、数据库字段判断为空时容易出现问题,如何从根本上解决这个问题

    m_Orchestrate learning system---三十二.数据库字段判断为空时容易出现问题,如何从根本上解决这个问题 一.总结 一句话总结:字段禁止为空,设置默认值0即可 禁止 空 默认 ...

  8. OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa

    元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...

  9. 工程师技术(二):postfix基础邮件服务、postfix空客户端邮件服务、搭建mariadb数据库系统、配置一个数据库、使用数据库查询

    一.postfix基础邮件服务 目标: 本例要求在虚拟机server0上配置 postfix 基础服务,具体要求如下: 1> 监听本机的所有接口    2> 将邮件域和邮件服务主机名都改为 ...

随机推荐

  1. Luogu T10025 排列名次

    题目链接 题目描述 给定一个长度为n的排列,要求输出该排列的字典序名次(1,2,3,...,n的名次为1). 输入输出格式 输入格式: 第一行一个数n,表示排列长度. 第二行n个数,用空格分隔,表示一 ...

  2. 高斯消元初步(Gauss算法)

    Gauss算法,称为高斯消元算法,用来解决n元一次方程,在解决线性方程问题起着重要作用. 简述 运用高斯消元的方法,我们可以在O(n3)的时间求出n元线性方程,但是由于时间复杂度的原因,请注意题目数据 ...

  3. hdu5627 Clarke and MST (并查集)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...

  4. Bézout恒等式

    写在前面: 记录了个人的学习过程,同时方便复习 整理自网络 非原创部分会标明出处 目录 结论 证明 拓展 n个整数间 拓展欧几里得算法 拓展欧几里得算法的多解 结论 (Bézout / 裴蜀 / 贝祖 ...

  5. - Visible Trees HDU - 2841 容斥原理

    题意: 给你一个n*m的矩形,在1到m行,和1到n列上都有一棵树,问你站在(0,0)位置能看到多少棵树 题解: 用(x,y)表示某棵树的位置,那么只要x与y互质,那么这棵树就能被看到.不互质的话说明前 ...

  6. C# ArrayList和List的区别

    ArrayList存的是object对象,可以装任何类型,但涉及装箱拆箱,效率低,类型转换可能报错 List只能存一种类型,不涉及装箱拆箱,效率高 总结:一般情况用List吧

  7. 忘记Mysql的root用户密码处理方法(以mysql 5.5.33为例)

    1.修改mysql服务器的脚本 ~]#vi /etc/rc.d/init.d/mysqld #找到$bindir/mysqld_safe --datadir="$datadir" ...

  8. 2.hello rabbitmq

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-07-22 22:49:50 星期一 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  9. K8s(一)----容器编排工具基础概念

    kubernetes(k8s)容器编排工具基础概念 Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controlle ...

  10. Java 对象的哈希值是每次 hashCode() 方法调用重计算么?

    对于没有覆盖hashCode()方法的对象 如果没有覆盖 hashCode() 方法,那么哈希值为底层 JDK C++ 源码实现,实例每次调用hashcode()方法,只有第一次计算哈希值,之后哈希值 ...