浅谈SQLite——查询处理及优化
2010-06-25 00:00:00 来源:WEB开发网优化部分的代码的基本的算法如下:
foreach level in all_levels
bestPlan.rCost = SQLITE_BIG_DBL
foreach table in tables that not handled
{
计算where中表达式能使用其索引的策略及代价rCost
If(sCost.rCost < bestPlan.rCost)
bestPlan = sCost
}
level.plan = bestPlan
该算法本质上是一个贪婪算法(greedy algorithm)。
bestBtreeIndex是某个表针对where子句中的表达式分析查询策略的核心函数,后面再讨论。
对于我们的例子,经过上面的优化处理后,得到的查询策略分3层循环,最外层是students表,全表扫描;中间层是sc表,利用索引 sqlite_autoindex_sc_1,即sc的key对应的索引;内层是course表,利用索引 sqlite_autoindex_course_1。
下面,开始生成(1)、(2)两部分的opcode,其中(1)由以下几行代码生成:
1 //生成打开表的指令
2 if( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0
3 && (wctrlFlags & WHERE_OMIT_OPEN)==0 ){
4 //pTabItem->iCursor为表对应的游标下标
5 int op = pWInfo->okOnePass ? OP_OpenWrite : OP_OpenRead;
6 sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op);
7 }
8
9 //生成打开索引的指令
10 if( (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ){
11 Index *pIx = pLevel->plan.u.pIdx;
12 KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIx);
13
14 int iIdxCur = pLevel->iIdxCur; //索引对应的游标下标
15
16 sqlite3VdbeAddOp4(v, OP_OpenRead, iIdxCur, pIx->tnum, iDb,
17 (char*)pKey, P4_KEYINFO_HANDOFF);
18 VdbeComment((v, "%s", pIx->zName));
19 }
20
更多精彩
赞助商链接