本文介绍: 解析器(Parser解析器根据SQL语句生成一颗语法解析树(parse tree)。分析器(Analyzer分析器语法解析树进行语义分析生成一颗查询树(query tree)。重写器(Rewriter)重写器按照规则系统存在规则,对查询树进行改写。计划器(Planner)计划基于查询树,生成一颗执行效率最高的计划树(plan tree)。执行器(Executor)执行器按照计划树中的顺序访问表和索引执行相应查询

PostgreSQL 查询处理期间发生了什么

文中主要内容引用PostgreSQL指南:内幕探索

查询处理是PostgreSQL中最为复杂子系统。如PostgreSQL官方文档所述,PostgreSQL支持SQL2011标准中的大多数特性查询处理子系统能够高效地处理这些SQL。

一、PostgresSQL 执行流程怎样的?

先来一个上帝视角图,下面就是 PostgreSQL 查询处理流程,也从图中可以看到 PostgreSQL 内部架构里的各个功能模块

QueryProcessing

PostgreSQL 的查询流程主要可以分以下几个模块也有很多文章解析器分析器放在一起这里参考PostgreSQL指南:内幕探索

  1. 解析器(Parser)

    解析器根据SQL语句通过词法分析语法分析生成一颗语法解析树(parse tree

  2. 分析器(Analyzer)

    分析器对语法解析树进行语义分析,生成一颗查询树(query tree

  3. 重写器(Rewriter)

    重写器按照规则系统存在规则,对查询树进行改写。

  4. 计划器(Planner)

    计划基于查询树,生成一颗执行效率最高的计划树(plan tree

  5. 执行器(Executor)

    执行器按照计划树中的顺序访问表和索引执行相应查询。

PostgreSQL的查询处理官方文档中有详细的描述

二、解析器(Parser)

mysql的解析器逻辑类似,很多文章将解析器与分析器放在一起;

解析器基于SQL语句文本进行词法分析和语法分析生成一颗后续子系统可以理解语法解析树。下面是一个具体的例子

考虑以下查询:

# SELECT id, data FROM tbl_a WHERE id < 300 ORDER BY data;

语法解析树如下

ParseTree

SELECT查询中的元素语法解析树中的元素有着对应关系比如,(1)是目标列表中的一个元素,与目标表的'id'相对应,(4)是一个WHERE子句,诸如此类。

当解析器生成语法分析树时只会检查语法,只有当查询中出现语法错误时才会返回错误。解析器并不会检查输入查询的语义,举个例子如果查询中包含一个不存在的表名,解析器并不会报错语义检查由分析器负责

二、分析器(Analyzer)

分析器对解析器产出的语法解析树(parse tree进行语义分析,并产出一颗查询树(query tree

查询树如下所示

QueyTree

简要介绍一下上图中的查询树:

查询树的细节查看官方文档

三、重写器(Rewriter)

类似于mysql预处理阶段

PostgreSQL的规则系统正是基于重写器实现的;当需要时,重写器会根据存储pg_rules中的规则对查询树进行转换

视图

在PostgreSQL中,视图是基于规则系统实现的。当使用CREATE VIEW命令定义一个视图时,PostgreSQL就会创建相应的规则,并存储系统目录中。

假设下面的视图已经被定义,而pg_rule中也存储了相应的规则。

# CREATE VIEW employees_list 
#   AS SELECT e.id, e.name, d.name AS department 
#      FROM employees AS e, departments AS d WHERE e.department_id = d.id;

执行一个包含该视图的查询,解析器会创建一颗如下图所示的语法解析树。

rewriter

rewriter

# SELECT * FROM employees_list;

在该阶段,重写器会基于pg_rules存储的视图规则将rangetable节点重写为一颗查询子树,与子查询相对应。

四、计划(优化)器(Planner)

类似于mysql优化阶段

计划器主要负责将 SQL 查询语句的执行方案确定下来。

计划器从重写器获取一颗查询树(query tree,会根据连接顺序索引信息计算不同路径可能代价值,最后选出最优者。基于查询树生成一颗能被执行器高效执行的(查询)计划树(plan tree

在PostgreSQL中,计划器是完全基于代价估计costbased的;它不支持基于规则的优化提示hint

一个简单的计划树以及其与EXPLAIN命令关系下图所示

planTree

计划树由许多称为**计划节点(plan node)**的元素组成,每个计划节点都包含着执行器进行处理所必需的信息,在单表查询的场景中,执行器会按照从终端节点往根节点的顺序依次处理这些节点。

比如图中的计划树就是一个列表,包含一个排序节点和一个顺序扫描节点;因而执行器会首先对表tbl_a执行顺序扫描,并对获取的结果进行排序

五、执行器(Executor)

类似于mysql的执行阶段

执行器最后执行plan遍历每个节点,以致完成。最后将查询结果返回给客户端

执行器会通过缓冲区管理器访问数据库集簇的表和索引。当处理一个查询时,执行器会使用预先分配内存空间比如temp_bufferswork_mem,必要时还会创建临时文件

执行器,缓冲管理器临时文件之间关系

dd

除此之外,当访问元组时候,PostgreSQL还会使用并发控制机制来维护运行事务一致性隔离性。


总结

可以看到, PostgreSQL 的查询流程主要分五个子系统

  1. 解析器(Parser)

    解析器根据SQL语句生成一颗语法解析树(parse tree)

  2. 分析器(Analyzer)

    分析器对语法解析树进行语义分析,生成一颗查询树(query tree)

  3. 重写器(Rewriter)

    重写器按照规则系统中存在的规则,对查询树进行改写。

  4. 计划器(Planner)

    计划器基于查询树,生成一颗执行效率最高的计划树(plan tree)

  5. 执行器(Executor)

    执行器按照计划树中的顺序访问表和索引,执行相应查询。

问题

PostgreSQL与Mysql的查询处理主要区别什么

  1. 数据库类型
  2. 查询复杂性
  3. 索引类型
  4. 数据加密
  5. 高级数据类型
    • PostgreSQL提供了更多的高级数据类型支持,如hstore和自定义数据类型。这使得PostgreSQL在处理特定类型的数据时更加灵活和强大[1]。MySQL在这方面的支持相对较弱。
  6. 并发控制

需要注意的是,上述区别是一般性的概述,实际的差异可能更加复杂,并且取决于具体的使用情境和配置设置选择适合自己需求数据库取决于企业的目标和资源限制。一般来说,PostgreSQL是一个更为强大和高级的数据库管理系统,适用于需要在大型环境中快速执行复杂查询的组织。而MySQL则是一个更适合预算和空间有限企业的理想解决方案

参考文献

​ 1.https://www.ibm.com/cloud/blog/postgresqlvsmysqlwhats-the-difference

​ 2.PostgreSQL指南:内幕探索

​ 3.PostgreSQL 9.4.4 中文手册

原文地址:https://blog.csdn.net/qq_42009262/article/details/134754652

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_32262.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注