PostgreSQL 主要模块原理

PG收到来自客户端的SQL语句后进入Parser模块,Parser模块负责词法分析、语法分析,生成各种Stmt结构体传入Analyzer进行语义检查,语义检查完后生成Query结构体进入查询重写阶段。查询重写主要是对视图的重写,然后进入优化器阶段进行查询优化。

查询优化分为逻辑优化和物理优化,逻辑优化主要包括:表达式预处理、子查询优化、子连接提升、等价谓词重写、条件化简、外连接消除等,对查询树进行等价逻辑优化,生成逻辑查询执行计划。物理优化则是基于代价的查询优化(Cost-based Optimizer,简称CBO),其主要流程是枚举各种待选的物理查询路径,并且根据路径上各节点的信息计算这些待选路径的代价,进而选择出代价最小的路径。以上是SPJ的优化,对于非SPJ优化主要是对分组、排序、聚集、去重等操作的优化。

PG查询优化器在物理查询执行计划阶段,在解决多表连接的问题时有两套算法:动态规划算法和遗传算法。动态规划算法适用于较少表连接的情况,一般是少于12个表对象的连接,超过12表的连接,使用遗传算法。但遗传算法不能保证得到最优的查询执行计划。

经过查询优化生成最优(cost最少)的执行计划,执行器执行计划获得查询结果返回给客户端。

猜你喜欢

转载自blog.csdn.net/helenbi/article/details/123416674