- 浏览: 225353 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
- 博客分类:
- PostgreSQL内核
话说 查询“ 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
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 1971题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1771话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1622话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1298Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1717话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1468话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1805在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1724话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1586话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1795话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1255话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1197话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15243 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5627到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13233 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1523话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 13843 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1544话说 main()->Postm ... -
PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
2012-07-12 16:24 1423话说启动进程调用 Startup ...
相关推荐
三、 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支持数据库服务器7.3及以上版本。 对于低于7.3版本的请使用pgAdmin II。
查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql
PostgreSQL技术内幕:事务处理深度探索.docx
NULL 博文链接:https://haige18.iteye.com/blog/1746527
一、服务器进程的启动和关闭: 下面是pg_ctl命令的使用方法和常用选项,需要指出的是,该命令是postgres命令的封装体,因此在使用上比直接使用postgres更加方便。 代码如下: pg_ctl init[db] [-D DATADIR] [-s]...
赠送jar包:postgresql-42.3.1.jar; 赠送原API文档:postgresql-42.3.1-javadoc.jar; 赠送源代码:postgresql-42.3.1-sources.jar; 赠送Maven依赖信息文件:postgresql-42.3.1.pom; 包含翻译后的API文档:...
postgresql &pg源码安装编译教程
嵌入式postgresql服务器为在unittests中运行postgres二进制文件提供了一种与平台无关的方法。
SQL Server 2000链接服务器到PostgreSQL
postgresql数据库jdbc驱动,jar包。。。。。。。。。。。。
赠送jar包:postgresql-42.2.5.jar; 赠送原API文档:postgresql-42.2.5-javadoc.jar; 赠送源代码:postgresql-42.2.5-sources.jar; 赠送Maven依赖信息文件:postgresql-42.2.5.pom; 包含翻译后的API文档:...
存储过程 postgresql postgresql存储过程
PostgreSQL中国社区资深数据库专家、沃趣科技首席数据库架构师撰写,PostgreSQL数据库领域经典著作 系统讲解PostgreSQL技术内幕,深入分析PostgreSQL特色功能,包含大量来自实际生产环境的经典案例和经验总结 ...
1.nacos服务,适配postgresql数据库。 2.提供nacos,postgresql的创建nacos数据库脚本。 3.nacos/conf/nacos-pg.sql数据库脚本文件。 4.nacos版本1.4.2。
postgresql--内核分析--多进程结构,
PostgreSQL9.6.0-CN中文指南 PG DBA必备
关于PostGreSQL中的存储过程 PostGreSQL是一个开源的数据库
linux搭建postgresql、postgis、pg_pathman环境步骤以及需要的软件包
包含四个自定义函数: lz4:接收bytea类型的数据,返回压缩后的bytea类型数据 un_lz4:接收bytea类型的数据,返回解压后的bytea类型数据 lz4_utf8:接收utf8编码的文本数据,返回解压后的bytea类型数据 un_lz4_utf8...