数据库管理系统最基本的操作包括查询、插入、删除和修改等,简称CRUD。
查询的执行,就是查询处理的过程,即数据库按用户指定的SQL语句中的语义,执行语义所限定的操作。为了提高查询语句的执行效率,必须对查询语句进行优化。
查询优化技术,就是对查询语句进行优化的技术,运用查询技术实现数据操纵功能的过程是确定给定查询的高效执行计划的过程。
执行计划,就是查询树,它由一系列内部的操作符组成,这些操作符按一定的运算关系构成查询的一个执行方案。查询优化的追求目标,就是在数据库查询优化引擎生成一个执行策略的过程中,尽量使查询的总开销(总开销通常包括IO、CPU、网络传输等)达到最小。
数据库查询优化技术主要包括:
这6项技术构成了一个“广义的数据库查询优化”的概念。与相对应的“狭义的数据库查询优化”,只包括“查询重写规则”和“查询算法优化”,这是多数书籍在提及“数据库查询优化”时所限定的范围。
从优化的内容角度看,查询优化分为:
对查询优化技术进行分类的角度:
本文主要包括以下内容:
数据库调优为了使数据库应用运行得更快,面向整个数据库管理系统,目标是
数据库调优的方式通常有:
数据库调优通常分为5阶段:
数据库调优涉及的技术:
查询重用是指尽可能利用先前的执行结果,以达到节约查询计算全过程的时间并减少资源消耗的目的。
目前查询重用技术主要集中在两个方面:
查询重用技术的弊端,如果结果集很大会消耗很大的内存资源,同样的SQL不同用户获取的结果集可能不完全相同。好处,节约了CPU和IO消耗。
查询重写是查询语句的一种等价转换,即对于任何相关模式的任意状态都会产生相同的结果(相同的关系替代两个表达式中相应的关系,所得到的结果是相同的)。
查询重写有两个目标:
关系代数的等价变换规则对查询重写提供了理论上的支持。查询重写后,查询优化器可能生成多个连接路径,可以从候选者中择优。
查询重写技术优化思路主要包括:
常见的查询重写技术类型,每一类都有自己的规则,这些规则没有确定的、统一的规律,但重写的核心一定是“等价转换”,只有等价才能转换。
查询优化即求解给定查询语句的高效执行计划的过程。
查询计划,也称为查询树,它由一系列内部的操作符组成,这些操作符按一定的运算关系构成查询的一个执行方案。
查询计划,从形式上看是一颗二叉树,树叶是每个单表对象,两个树叶的父结点是一个连接操作符(如左外连接操作符,A left-out join B)连接后的中间结果(另外还有一些其他结点如排序操作等也可以作为中间结果),这个结果是一个临时“关系”,这样直至根结点。
一个查询计划涉及的主要“关系结点”包括:
生成最好的查询计划的策略通常有两个:
查询优化器的实现,多是两种优化策略组合使用,如MySQL和PostgreSQL就采取了基于规则和代价估算的查询优化策略。
多表连接使用最广泛的优化算法有如下几种:
查询的基本操作是选择、投影和连接。选择和投影的优化规则适用于SPJ(Select-Project-Join)和非SPJ(SPJ+GROUPBY等操作)。连接包括两表连接和多表连接。多表连接是其中最难的,因为多表连接有多种连接次序,所以查询的执行计划的数目随表个数呈指数级增长,搜索空间极度膨胀,仅搜索花费最小的查询计划就开销巨大,这是查询优化器实现时需要考虑的问题。
在单机数据库系统中,给定一个查询(Query),查询优化算法只需找到查询的一个具有最小执行花费的执行计划。但在并行数据库系统中,需要把查询工作分解为一些可以并行运行的子执行计划。一些商业数据库提供了并行查询的功能,用以优化查询执行操作。
一个查询能否并行执行,取决于以下因素:
在分布式数据库系统中,查询优化的重点是:
在查询优化策略中,数据的通信开销是优化算法考虑的主要因素。分布式查询优化以减少传输的次数和数据量作为查询优化的目标。所以,分布式数据库系统中的代价估算模型,除了考虑CPU代价和IO代价外,还要考虑通过网络在结点间传输数据的代价。
代价估算模型:总代价=IO代价+CPU代价+通信代价
数据库的查询性能,还取决于其他一些因素,如数据库集群系统中的SD(Share Disk)集群和SN(Share Nothing)集群,不同的架构查询优化技术也不同。SD集群采用的是共享存储方式,在数据的读写时可能产生读写冲突,单表扫描会受到影响。SN集群采用的是非共享式存储方式,所以在考虑了通信代价后单结点的优化方式依然适用。