WEB开发网
开发学院数据库MySQL 浅谈SQLite——查询处理及优化 阅读

浅谈SQLite——查询处理及优化

 2010-06-25 00:00:00 来源:WEB开发网   
核心提示: 优化部分的代码的基本的算法如下:foreachlevelinall_levelsbestPlan.rCost=SQLITE_BIG_DBLforeachtableintablesthatnothandled{计算where中表达式能使用其索引的策略及代价rCostIf(sCost.rCost&l

优化部分的代码的基本的算法如下:

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 

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:SQLite 查询处 理及

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接