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 */}; (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|