暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库查询逻辑优化

景闻你好 2020-12-09
572

查询优化器在逻辑优化阶段主要解决的问题是如何找出SQL语句等价的变换形式,使得SQL执行更高效。

查询优化技术的理论基础

关系代数

1970年,E.F.Codd在题为《A Relation Model of Data for Shard Data Banks》的论文中提出了数据的关系模型的概念。Codd提议将关系代数作为数据库查询语言的基础。关系数据库的对外接口是SQL语句,所以SQL语句中的DML,DQL基于关系代数实现了关系的运算。


作为数据库查询语言的基础,关系模型由关系数据结构,关系操作集合和关系完整性约束三部分组成。

  1. 关系是一种对象,关系的另外一个常用词是表。关系更偏向理论,表更关注实际数据库中的增删改查等操作的对象

  2. 关系的元数据即表的结构,通常称为列和属性,有的用filed或者item来表示,关系的数据即表的行数,通常称为元组tuple,也称为记录record,一个表有多行元组。

  3. 对关系进行的操作就是关系运算。关系运算是将一定的运算符作用于一定的关系对象上,得到预期的运算结果。运算对象,运算符,运算结果是运算的三大要素,所以关系运算就是关系运算符作用在关系上,得到的结果形式也是关系形式的操作。

常用的关系代数的运算符包括以下4类

  1. 传统集合运算符。并(UNION),交(INTERSECTION),差(DIFFERENCE),积(EXTENDED CARTESIAN PRODUCT).

  2. 专门的关系运算符。选择(SELECT),投影(PROJECT),连接(JOIN),除(DIVIDE).

  3. 辅助运算符。用来辅助专门的关系运算符进行操作的,包括算法比较符和逻辑运算符。


关系代数等价变换规则对优化的指导意义

关系代数表达式的等价:也就是说相同的关系代数代替两个表达式中相应的关系,所得到的结果是相同的。两个关系表达式E1和E2是等价的,记为E1≡E2(恒等于)

查询语句可以表示为一颗二叉树

  • 叶子是关系

  • 内部节点是运算符(或称算子,操作符,如LEFT OUTER JOIN),表示左右子树的运算方式。

  • 子树是表达式或SQL片段

  • 根节点是最后运算的操作符,根节点运算之后,得到的是SQL查询优化的结果。这样一课树就是就是一个查询的路径

  • 多个关系连接,连接的顺序不同,可以得出多个类似的二叉树。

  • 查询优化就是找出代价最小的二叉树,即最优的查询路径。每条路径的生成,包括单表的扫描,两表的连接,多表顺序连接,多表连接搜索空间等技术。

  • 基于代价估算的查询优化就是通过计算和比较,找出花费最小的最优二叉树


运算符的角度考虑优化

不同的运算符根据其特点,可以对查询语句做不同的优化,优化可以减少中间生成物的大小和数量,节约IO,内存等,从而提高了执行速度。但优化的前提是:优化前和优化后语义必须等价。不同运算符的优化规则和可优化的原因如下


下推到集合的运算的转换实例:


运算规则角度考虑优化

查询重写规则

启发式规则在逻辑优化阶段的应用

总结

本篇文章从逻辑查询优化的基础关系代数开始,首先简略概述了关系代数的基础知识,重点在于描述关系代数的主要概念,分析关系代数的原理对于查询优化的指导意义,为查询优化技术做铺垫,通过PostgresSQL为示例,全面分析了查询优化可用的技术。


文章转载自景闻你好,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论