本站首页    管理页面    写新日志    退出


«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:
日志总数:3
评论数量:5
留言数量:0
访问次数:46091
建立时间:2004年12月28日




[POSTGRES..POSTGRESQL]POSTGRESQL的查询处理过程
读书笔记

typez 发表于 2004/12/28 23:05:39

今晚不想编程,就通过postgresql的文档学习了一下。 下文译自 http://developer.postgresql.org/docs/pgsql/src/tools/backend/index.html 一个查询通过TCP/IP或Unix Domain socket的数据包到达后端(backend)。它被保存到一个字符串中并传送到parser,在那儿,扫描器 scan.l 把该查询分解为一个个的单词(token or words)。该parser使用gram.y 和分解后的单词来标识查询的类型,并装载正确的跟特定查询相关的数据结构,象CreateStmt或SelectStmt。        然后该查询被标识为一个Utility查询或一个更复杂的查询。一个Utility查询由commands中跟该查询对应的函数处理。一个更复杂的查询,例如SELECT,UPDATE和DELETE则需要更多的处理工作。        对于一个复杂查询,parser创建一个Query结构用于包含所有会被该查询使用到的元素。Query.qual包含WHERE子句限定,它由transformWhereClause()进行填充。在查询中引用到的每个表都被表示为一个RangeTableEntry,并且它们通过互相连接(linked together)形成了该查询的range table,此range table由transformFromClause()生成。Query.rtable用于存放该查询的range table。 特定的查询,象是SELECT,返回列的数据。其它查询,象是INSERT和UPDATE,指定所需要修改的列。这些对列的引用都被转换为放置于target list entries中的Resdom条目(entry),并且通过互相连接形成该查询的目标列表(target list)。该目标列表保存于Query.targetList中,并由transformTargetList()生成。 其它的查询元素,象是aggregates(SUM()),GROUP BY,和ORDER BY也都存放于它们自己对应的Query字段中。 下一步是使用任何可以应用到该查询上的VIEWS和RULES对它进行修改。该任务由rewrite系统完成。 然后,optimizer接手该Query结构并由此生成一个optimal Plan,其中包含完成该查询所需要执行的操作。RangeTable中每一个表最优化的连接(join)顺序和连接(join)类型由path模块决定,它也使用Query.qual(WHERE子句)来考虑优化的索引使用。 该Plan随之被传送到executor进行实际的执行,并把结果返回给客户端。该Plan实际是一个节点(node)的集合,它被整合为一个树形的结构:有一个顶端节点和一些不同的子节点作为它的儿子。 另外还有许多其它模块以支持该基本功能的实现。


阅读全文(2145) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.555 second(s), page refreshed 144802792 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号