查询执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询执行相关的知识,希望对你有一定的参考价值。


【高级数据库】第三章 查询执行

  第二章主要讲解如何在文件上添加索引来提高操作效率。第三章和第四章将主要讲解查询的实现细节。

第01讲 查询计划

1、查询编译预览

  查询编译执行可分为三个步骤:
(1)分析:建立查询的分析树;
(2)查询重写:分析树被转化为初始查询计划,通常是查询的代数表达式;然后初始查询计划被转化为一个预期所需执行时间最小的等价的计划;
(3)物理计划生成:根据上一步的抽象的查询计划,对每一个字符选择实现算法,并选择这些操作符的执行顺序,将逻辑查询计划转化为物理查询计划。物理计划用表达树表示。
  操作符的划分:
(1)一次单个元组(一元操作):例如选择和投影不需要一次在内存中装入整个关系;
(2)整个关系(一元操作):需要一次性从内存中看到所有或大部分元组,例如分组操作和去重操作;
(3)整个关系(二元操作):例如并、交、差、连接和积;

2、物理查询计划

2.1 扫描表:

  查询整个表操作,读取关系R中满足指定谓词的元组,包含两种方法:
(1)表-扫描:根据元组存放的块,系统一个一个获取这些块;
(2)索引-扫描:若R上任意一个属性有索引,则可以使用索引得到所有元组;
  当扫描表时需要排序时(ORDER BY),采用物理查询计划操作符“排序-扫描”,实现方法:先用表扫描或索引扫描获得所有元组,然后在内存(或外存)进行排序;

2.2 操作符I/O代价

  表达操作符代价的参数(统计数据):
(1)描述一个关系R的大小时,关系R所有元组所需要的块的数目,表示 【高级数据库】第三章,简单描述为 【高级数据库】第三章 。假设R是聚集的,即R存储在 【高级数据库】第三章 个块中。
(2)描述一个关系R的大小时,关系R所有元组的数目,表示为 【高级数据库】第三章 简单描述为 【高级数据库】第三章 ,一个块中可以容纳的元组数则为 【高级数据库】第三章
(3)对于关系R的某一个属性a,属性a对应不同取值的数目,表示为 【高级数据库】第三章
  操作I/O代价:
(1)表-扫描:如果R是聚集的,I/O代价为 【高级数据库】第三章 ;如果不是聚集的,则代价为 【高级数据库】第三章
(2)索引——扫描:【高级数据库】第三章【高级数据库】第三章

3、一趟算法

3.1 一次单个元组一元操作

【高级数据库】第三章

【高级数据库】第三章 ,否则为 【高级数据库】第三章

3.2 整个关系的一元操作

(1)去重:

【高级数据库】第三章


从磁盘中读取R的一块,并输入到输入缓冲区,然后遍历所有元组,当当前元组从未出现,则复制到缓冲区中保存副本,若已出现则跳过。每次检查当前元组是否出现均需要扫描副本缓冲区,可设置散列表降低时间开销。

3.3 二元操作

【高级数据库】第三章【高级数据库】第三章 满足的二元操作,先取其中较小的操作数读入内存中,并为其建立一个合适的数据结构,支持删除和检索(散列表或平衡二叉树)。

【高级数据库】第三章


【高级数据库】第三章


以上是关于查询执行的主要内容,如果未能解决你的问题,请参考以下文章

一文读懂简单查询代价估算

PostgreSQL——代价估计

PostgreSQL——代价估计

PostgreSQL——代价估计

PostgreSQL——代价估计

基于代价的慢查询优化建议