| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 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)的集合,它被整合为一个树形的结构:有一个顶端节点和一些不同的子节点作为它的儿子。
另外还有许多其它模块以支持该基本功能的实现。 |
|
|