【PostgreSQL内核学习(十)—— 查询执行(可优化语句执行)】
发布人:shili8
发布时间:2025-02-11 10:19
阅读次数:0
**PostgreSQL内核学习(十)—— 查询执行(可优化语句执行)**
在前九篇文章中,我们已经了解了PostgreSQL的基本架构、存储引擎、缓冲池管理等核心概念。今天我们要讨论的是查询执行,这是PostgreSQL最重要也是最复杂的一部分。
**什么是查询执行?**
查询执行是指数据库系统接收到一个SQL语句后,如何将其转换为机器可以理解的命令,并且在数据库中找到所需的数据。这个过程涉及多个阶段,包括解析、优化、执行等。
**可优化语句执行**
在PostgreSQL中,查询执行的第一步是解析SQL语句。这一步骤会将SQL语句转换为一个抽象语法树(AST),也就是我们常说的parse tree。这个过程涉及到词法分析、语法分析等。
sql--例子:SELECT * FROM users WHERE id =1;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag; // 节点类型 int numChild; // 子节点数量 Oid opClass; // 操作类别 Oid opMethod; // 操作方法 Oid opType; // 操作类型 int numArgs; // 参数数量 Arg *args; // 参数列表} AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_SelectStmt; // 节点类型:SELECT语句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Users; // 操作类别:users表 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "users" } // 变量参数:users表 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_WhereClause; // 节点类型:WHERE子句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Id; // 操作类别:id列 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "id" } // 变量参数:id列 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_SelectStmt; // 节点类型:SELECT语句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Users; // 操作类别:users表 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "users" } // 变量参数:users表 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_WhereClause; // 节点类型:WHERE子句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Id; // 操作类别:id列 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "id" } // 变量参数:id列 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_SelectStmt; // 节点类型:SELECT语句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Users; // 操作类别:users表 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "users" } // 变量参数:users表 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_WhereClause; // 节点类型:WHERE子句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Id; // 操作类别:id列 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "id" } // 变量参数:id列 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_SelectStmt; // 节点类型:SELECT语句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Users; // 操作类别:users表 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "users" } // 变量参数:users表 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_WhereClause; // 节点类型:WHERE子句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Id; // 操作类别:id列 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1 }, // 常量参数:1 { T_Var, "id" } // 变量参数:id列 }; } AstNode;
解析后,我们得到如下AST:
c// AST 结构体typedef struct AstNode { NodeTag tag = T_SelectStmt; // 节点类型:SELECT语句 int numChild =2; // 子节点数量:2个 Oid opClass = Opclass_Users; // 操作类别:users表 Oid opMethod = Opmethod_Equal;// 操作方法:等于 Oid opType = OpType_Integer; // 操作类型:整型 int numArgs =1; // 参数数量:1个 Arg *args = (Arg[]) { // 参数列表: { T_Const,1