PostgreSQL的查询优化

PostgreSQL的查询优化

 

 

数据库管理系统中的SQL执行,有多种多样,从SQL语句类型上讲,有DDLDMLDQLDCL。不同语句,被数据库引擎执行,其执行方式、复杂程度都不相同。

其中,最为复杂的,是DQL,查询语句。查询语句的执行,在数据库中,又可以分为2个阶段,一是查询计划的生成(PG的处理方式包括:预处理、生成路径)、二是依据查询计划做查询动作的执行。

查询语句,本依据SQL语句的语义,逐一执行用户指定的动作即可,但是,查询语句,可以做等价变换,这样可以使得查询的实际效率得以提高。于是,有了查询优化一说。查询优化,基于关系代数变换,把用户指定的SQL经过“等价”的代数转换,变为一种更节省IO(或更节省CPU,但是,多数数据库系统的瓶颈在于IO)的执行序列,但用户的语义没有发生变化,这样,执行起来则更为高效。

查询计划的生成,是基于关系代数的。用于简化所有类型表达式中最通用的代数定律是交换律和结合律。交换律和结合律的存在,使得在SELECT查询语句中的From-list字句中的对象可以被等价变换位置,这样,有利于2个表在内存里做连接(一些连接算法是根据表的数据量来决定是表A连接表B还是表B连接表A,这样的操作,在理论上没有差别,但在算法上,会导致IO的不同,因此,好的连接次序,能提高连接效率。而选择哪种方式,是根据预估数值的最终计算值比较大小选取最小的值的)。对于被选择的目标对象(select-list),有些和WHERE-list字句或其他字句提及的列对象相关,所以,关系代数中做选择(投影操作)也存在优化的可能,把一些列“下推”(pull down)到其他位置,也可以减少IO,从而提高连接效率。对于一些子查询等语句(还包括有INEXIST等涉及半连接、反半连接操作),可以把一些子句“上拉”(pull up)到更高层次执行,以节约IO。还有一些操作,如消重、分组等,都有可以优化之处,这全依赖于关系代数规则。在关系代数规则下实现的优化,可以有效去除掉大量IO操作,去掉大量IO,又依赖于对具体算法的选择,因此,查询优化,实则也依赖于查询执行过程中的具体算法的“IO预期”。

查询计划的生成,还和多个关系做连接有关系。如果存在多个关系(表)做连接,则连接的顺序,也影响着查询的效率,所以,查询优化,也会讨论如何决定多个关系之间做连接,优先连接哪些关系。

查询计划的生成,是根据关系代数对各种关系的连接可能进行计算(找出多条路径,计算的数值很重要,通常数据库引擎有个预估值,还有个不断收集需要的值的统计者如行数列数等统计者),找出其中总值最小的,作为执行的路径,送交执行器执行。但多个关系之间的连接代价如何计算,也是一个需要关注的问题。

查询计划的执行,在数据库引擎中是执行器所完成的工作。执行器根据查询计划,逐步调用相关算法,执行。这样的算法包括:一趟算法、嵌套循环连接、基于排序的两趟算法、基于散列的两趟算法、基于索引的算法、使用超过两趟的算法等等。不同的数据库,通常会有不同的但类似的实现。

本文的侧重点,集中于查询计划的生成。查询计划的执行,实则是不同算法的实现,另行讲述。

 

1          查询优化的原理

1.1      关系代数

查询优化,基于“关系代数”。

对于关系代数的初步认识,可以参看:

http://zh.wikipedia.org/zh-cn/%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0_%28%E6%95%B0%E6%8D%AE%E5%BA%93%29

 

在数据库中,表与表之间的连接关系,除了参见上文外,可以参考:

数据库查询中的表连接(一):http://blog.163.com/li_hx/blog/static/1839914132011812920293/

数据库查询中的表连接(二):http://blog.163.com/li_hx/blog/static/18399141320118129221928/

1.2      关系代数详解

参见《数据库系统实现》。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值