http://www.kanwenzhang.com/software/DB-MySQL/c/4335/34335.html
查询处理及优化关系数据库得以流行
根本原因,
关系数据库系统最核心
技术
。SQLite
查询处理模块非常
精致,而且
容易移植
不支持 SQL
存储引擎,Berkeley DB最新
版本已经
其完整
移植过
。本文
简
讨论
SQLite
查询处理及优化。
查询处理般
说,包括词法分析、语法分析、语义分析、生成执行计划以及计划
执行几个部分。SQLite
词法分析器
手工
,语法分析器由 Lemon生成,语义分析主
进行语义方面
些检查,比如table
否存
等。而执行计划
生成及执行
最核心
两部分,
相
比较复杂、有点技术含量
东西。SQLite
执行计划采
虚拟机
思想,实际
,这种基于虚拟机
思想并非SQLite所独有,但
,SQLite
其发挥
极致,
生成
执行计划非常详细,而且
容易读(
这里,
不得不佩服D. Richard Hipp
编译理论方面
功底)。
1、语法分析——语法树
词法分析本身比较简单,这里就不谈。语法分析
主
任务就
户输入
SQL语句进行语法检查,然
生成
个包含所有信息
语法树。
于SELECT语句,这个语法树最终由结构体Select表示:
struct Select {
ExprList *pEList; /* The fields of the result */
u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */
char affinity; /* MakeRecord with this affinity for SRT_Set */
u16 selFlags; /* Various SF_* values */
SrcList *pSrc; /* The FROM clause */
Expr *pWhere; /* The WHERE clause */
ExprList *pGroupBy; /* The GROUP BY clause */
Expr *pHaving; /* The HAVING clause */
ExprList *pOrderBy; /* The ORDER BY clause */
Select *pPrior; /* Prior select in a compound select statement */
Select *pNext; /* Next select to the left in a compound */
Select *pRightmost; /* Right-most select in a compound select statement */
Expr *pLimit; /* LIMIT expression. NULL means not used. */
Expr *pOffset; /* OFFSET expression. NULL means not used. */
int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */
int addrOpenEphm[3]; /* OP_OpenEphem opcodes related to this select */
};