1. 访问路径
是指针对某个表的读取方式,最普通的是heap_scan的方式,即表扫描的方式,如果表上有索引,还可以有索引扫描的方式,具体采用哪种方式进行扫描,依赖于选择条件中的主合取体。
选择条件称为合取范式,每个合区条件是一个合取体。
选择中的每个条件是一个合取体,能够和索引匹配的选择条件称为主合取体。
1.1 选择操作
选择操作是反应sql语句中过滤条件的一种操作,对于聚簇索引,使用索引扫描的方式做选择操作通常会比较好,但如果索引是非聚簇的,则元祖可能散布在不同的页面,效率也可能不高。
经验值是选择超过5%的页面,往往通过直接表扫描的方式效率会更好。
1.2 投影操作
如果不去除重复。
1.3 连接操作
2. 查询优化概述
2.1. 流水线操作
某个操作结果不经过物化直接通过管道提供给下一个操作应用,即为流水线操作。
2.2 迭代器接口
open -> getNext ->close
屏蔽了不同的扫描操作的细节(如通过表扫描、索引扫描、排序扫描)。
3. 常用的优化方式
3.1 下推选择
连接操作是比较耗时的操作,通过下推选择操作过滤掉关系中的一些元组,使连接的表的数据量减少。
3.2 使用索引
4. 一个典型的优化器要做什么
4.1 考虑不同的查询计划
考虑将选择和叉积合并到连接中
考虑将选择和投影下推到连接前
重新考虑连接顺序
通常连接采用左深树,优势是能够全流水线作业。
4.2 估算计划的代价
常用的IO代价:读输入表、写中间表、结果排序。
5.数据库三大范式
第一范式 无重复的列 数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性 在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。 第二范式 属性完全依赖于主键 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。 当存在多个主键的时候,才会发生不符合第二范式的情况。比如有两个主键,不能存在这样的属性,它只依赖于其中一个主键,这就是不符合第二范式。 如果存在不符合第二范式的情况,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。 第三范式 属性不能传递依赖于主属性(属性不依赖于其它非主键属性) 第三范式(3NF)是在第二范式(2NF)的基础上建立起来的,即满足第三范式(3NF)必须先满足第二范式(2NF)。 如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。
原文链接:https://www.f2er.com/postgresql/195701.html