`

PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree

阅读更多

 

话说 查询“ select cname, comp from test1, test2 where test1.id=test2.id; 发送到服务器端, 走查询分支 exec_simple_query ,先调用 start_xact_command 初始化了事务管理相关对象和资源,接着调用 pg_parse_query ,通过 Lex Yacc 对传入 SQL 语句进行词法语法解析,生成解析树。下来调用 GetTransactionSnapshot 方法做内存快照,然后调用 pg_analyze_and_rewrite 方法,进行语义分析把 parsetree 转换成 querytree ,然后对该 querytree 进行重写。

 

1

下面是对 parseetree 进行语义分析和查询重写的调用序列图。



 

 

Postgres 服务进程简查之语义分析和查询重写调用序列图

 

       上图红色方框中显示了对 parsetree 进行语义分析和查询重写的方法调用过程,在 parse_analyze 方法中对 parsetree 进行语义分析,生成 querytree ,在 pg_rewrite_query 方法中对前面生成的 q uerytree 进一步进行修改,最后把 querytree 返回给 exec_simple_query 。在 parse_analyze 方法中根据这个例子中语句生成的 节点类型 T_SelectStmt transformSelectStmt 分支,分别调用 transformFromClause transformTargetList transformWhereClause 方法处理 from 、目标属性、 where 子句。处理完后把目标传到 pg_rewrite_query 方法,在 pg_rewrite_query 方法里利用规则 /rule querytree 中对应的目标进行重写,规则是查询重写处理的关键, pg 的规则中 pg_write 系统表中。规则和触发器相似,都可以在某种条件下激活,可执行原命令之外的动作,区别是触发器多涉及到每个元组都执行一次,而规则对整个查询树 querytree 进行修改或额外的查询。一个语句如果涉及多个元组,规则一般比触发器效率高,但触发器更容易理解。

       这部分内容涉及到结构和处理及代码量相当多,在这就不列举了,有兴趣的根据方法调用流程图看源码吧,下面给出处理完的结果 querytree 结构图。

 



 

 

例子里查询语句对应的 querytree 结构图

把这个例子再重复一下:

create table test1 (ID numeric(10), cname varchar(30));

create table test2 (ID numeric(10), comp varchar(30));

select cname,comp from test1,test2 where test1.id=test2.id;

上面的图《例子里查询语句对应的 querytree 结构图》就是 SQL 语句“ select cname,comp from test1,test2 where test1.id=test2.id ”在 pg 里产生的 querytree

 

pg 输出的 querytree 如下:

2011-11-23 06:57:39 HKT DETAIL:  (

          {QUERY

          :commandType 1

          :querySource 0

          :canSetTag true

          :utilityStmt <>

          :resultRelation 0

          :intoClause <>

          :hasAggs false

          :hasWindowFuncs false

          :hasSubLinks false

          :hasDistinctOn false

          :hasRecursive false

          :hasModifyingCTE false

          :hasForUpdate false

          :cteList <>

          :rtable (

             {RTE

             :alias <>

             :eref

                {ALIAS

                 :aliasname test1

                :colnames ("id" "cname")

                }

             :rtekind 0

             :relid 16394

             :relkind r

             :inh true

             :inFromCl true

             :requiredPerms 2

             :checkAsUser 0

             :selectedCols (b 9 10)

             :modifiedCols (b)

             }

             {RTE

             :alias <>

             :eref

                {ALIAS

                :aliasname test2

                :colnames ("id" "comp")

                }

             :rtekind 0

             :relid 16397

             :relkind r

             :inh true

             :inFromCl true

             :requiredPerms 2

             :checkAsUser 0

             :selectedCols (b 9 10)

             :modifiedCols (b)

             }

          )

          :jointree

             {FROMEXPR

             :fromlist (

                {RANGETBLREF

                :rtindex 1

                }

                {RANGETBLREF

                :rtindex 2

                }

             )

             :quals

                {OPEXPR

                :opno 1752

                :opfuncid 1718

                :opresulttype 16

                :opretset false

                :opcollid 0

                :inputcollid 0

                :args (

                    {VAR

                   :varno 1

                   :varattno 1

                   :vartype 1700

                   :vartypmod 655364

                   :varcollid 0

                   :varlevelsup 0

                   :varnoold 1

                   :varoattno 1

                   :location 41

                   }

                   {VAR

                   :varno 2

                   :varattno 1

                   :vartype 1700

                   :vartypmod 655364

                   :varcollid 0

                   :varlevelsup 0

                   :varnoold 2

                   :varoattno 1

                    :location 50

                   }

                )

                :location 49

                }

             }

          :targetList (

             {TARGETENTRY

             :expr

                {VAR

                :varno 1

                :varattno 2

                :vartype 1043

                :vartypmod 34

                :varcollid 100

                :varlevelsup 0

                :varnoold 1

                :varoattno 2

                :location 7

                }

             :resno 1

             :resname cname

             :ressortgroupref 0

             :resorigtbl 16394

             :resorigcol 2

             :resjunk false

             }

             {TARGETENTRY

             :expr

                {VAR

                :varno 2

                :varattno 2

                :vartype 1043

                :vartypmod 34

                :varcollid 100

                :varlevelsup 0

                :varnoold 2

                :varoattno 2

                :location 13

                }

             :resno 2

             :resname comp

             :ressortgroupref 0

             :resorigtbl 16397

             :resorigcol 2

             :resjunk false

             }

          )

          :returningList <>

          :groupClause <>

          :havingQual <>

          :windowClause <>

          :distinctClause <>

          :sortClause <>

          :limitOffset <>

          :limitCount <>

          :rowMarks <>

          :setOperations <>

          :constraintDeps <>

          }

       )

就到这儿吧。

 




------------
转载请注明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com

  • 大小: 144.6 KB
  • 大小: 246.6 KB
0
0
分享到:
评论

相关推荐

    PostgreSQL中文手册9.2

    三、 pg_attrdef: pg_attrdef: pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef: . 63 四、 pg_authid: pg_authid: pg_authid: pg_authid:pg_authid: 64 五、 pg_auth_members: pg_...

    PGAdmin系统管理PostgreSQL 中文手册

    pgAdmin是一款免费的开源软件,专为PostgreSQL设计,提供了直观的界面,使得数据库的管理、查询、备份以及监控等工作变得简单易行。 **1. pgAdmin简介** pgAdmin是PostgreSQL数据库管理员和开发者的理想选择,它...

    PostgreSQL 存储过程调试

    PostgreSQL的`EXPLAIN`命令可以帮助分析查询计划,但对存储过程的内部执行细节并不适用。可以使用`log_min_messages`配置参数调整日志级别,记录存储过程的执行信息。更高级的调试可能需要启用`track_functions`...

    postgresql--内核分析--多进程结构

    ### PostgreSQL内核分析——多进程结构 #### 一、进程的理解与创建 进程是一个正在运行的程序实例,它具有动态的特性。对于程序员而言,所编写的代码在未经编译之前仅是静态的源代码。当这些代码经过编译、链接等...

    Postgresql存储过程

    Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的集合,它可以完成复杂的操作,并且可以重复使用。Postgresql存储过程可以用来实现业务逻辑,减少数据库服务器的压力和网络传输的数据量。 一、存储...

    PostgreSQL技术内幕:事务处理深度探索.docx

    PostgreSQL 事务处理技术内幕深度探索 PostgreSQL 是一种开放源代码的关系数据库管理系统(RDBMS),它具有高度的可靠性、稳定性和安全性,被广泛应用于各种企业级应用和云服务。PostgreSQL 的事务处理机制是...

    linux搭建postgresql、postgis、pg_pathman环境步骤以及需要的软件包

    在Linux系统上搭建PostgreSQL、PostGIS和pg_pathman环境是一项关键的任务,这些组件共同构成了一个强大的地理空间数据库解决方案。PostgreSQL是一种开源的关系型数据库管理系统,具有高度的可扩展性和可靠性;...

    postgresql查询死锁以及杀死死锁进程sql.txt

    查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql

    dbdpg:Perl Postgres驱动程序DBD :: Pg aka dbdpg

    DBD::Pg作为DBI的子模块,专为PostgreSQL提供服务。 **PostgreSQL与libpq** PostgreSQL,通常简称为Postgres,是一种开源的关系型数据库管理系统(RDBMS),以其高度的稳定性和强大的功能著称。libpq是PostgreSQL...

    PostgreSQL教程(十一):服务器配置

    PostgreSQL的配置参数不区分大小写,它们可以在`postgresql.conf`文件中进行设置。此文件通常位于数据目录下,如`/opt/PostgreSQL/9.1/data/postgresql.conf`。配置参数可以是布尔、整数、浮点数或字符串类型。例如...

    Go-PostgreSQLBGWorker用Go编写的PostgreSQL后台工作进程

    在PostgreSQL数据库系统中,后台工作进程(Background Worker)是一种扩展其功能的重要机制。这些进程独立于主要的数据库服务器进程运行,允许开发者实现自定义任务,如定期维护、监控或其他后台服务。Go语言以其...

    pgadmin3 - 1.14.2 Postgresql 客户端程序

    在本文中,我们将深入探讨pgAdmin3的功能、安装过程以及如何使用它来管理PostgreSQL数据库。 ### pgAdmin3 简介 pgAdmin3 是一个开源的、跨平台的应用程序,适用于Windows、Linux、Mac OS X等多种操作系统。作为...

    postgresql数据库插件PG-Strom中Scan算子执行流程分析

    PG-Strom是一款针对PostgreSQL数据库的高性能计算扩展,它利用GPU(图形处理器)的并行计算能力,优化数据库的查询处理,尤其是在大数据量和复杂计算场景下表现优越。PG-Strom的核心是将部分数据库操作转移到GPU上...

    关于PostGreSQL中的存储过程

    PostgreSQL 存储过程详解 PostgreSQL 是一个开源的数据库管理系统,它提供了强大的数据存储和管理功能。...本文详细介绍了 PostgreSQL 中的存储过程,并提供了一个使用函数来查询数据的示例代码。

    postgresql客户端pgadmin3-1.8.4

    1. **安装与配置**:pgAdmin3-1.8.4的安装过程相对简单,支持Windows、Linux和macOS等多个操作系统。安装完成后,用户需要配置连接参数,如主机名、端口号、数据库名、用户名和密码,以便连接到PostgreSQL服务器。 ...

    DBD-Pg-2.15.1

    DBD::Pg是Perl编程语言中的一个数据库驱动模块,它与DBI(Database Interface,数据库接口)模块一起工作,为开发者提供了访问PostgreSQL数据库的能力。PostgreSQL是一种强大的开源关系型数据库管理系统,以其高度的...

    PostgreSQL12.2中文手册.chm.7z

    PostgreSQL是一种开源的对象关系型数据库管理系统(ORM DBMS),它以其强大的功能、高度的可扩展性和稳定性在全球范围内被广泛使用。版本12.2是PostgreSQL的一个重要版本,提供了许多新特性和性能优化,旨在提升...

    postgresql-embedded,嵌入式PostgreSQL服务器.zip

    【嵌入式PostgreSQL服务器】是一种特殊的数据库实现,它允许开发者将PostgreSQL数据库引擎直接集成到他们的应用程序中,而不是作为独立的服务运行。这样的设计对于那些需要在本地或内存中快速访问数据的应用,或者...

    PostgreSQL 9.6 RPM包

    7. **设置权限和防火墙**:确保PostgreSQL服务可以被允许的用户访问,可能需要调整`pg_hba.conf`配置文件和Linux防火墙规则,通常允许本地连接或者特定IP地址。 8. **管理数据库**:通过`psql`命令行客户端连接到...

    PostgreSQL9.6.0-CN中文指南 PG DBA必备

    本书深入讲解了SQL语言在PostgreSQL中的应用,包括查询、插入、更新和删除数据,以及更复杂的联接、子查询和集合操作。此外,还会涉及视图、索引、触发器和存储过程的创建与管理。 五、安全性与权限管理 确保数据库...

Global site tag (gtag.js) - Google Analytics