资源描述:
《SQLite的查询优化》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、SQLite的查询优化Postedon2009-03-0312:18 上善 阅读(2060) 评论(9) 编辑 收藏 所属分类: DBMS SQLite是个典型的嵌入式DBMS,它有很多优点,它是轻量级的,在编译之后很小,其中一个原因就是在查询优化方面比较简单,它只是运用索引机制来进行优化的,经过对SQLite的查询优化的分析以及对源代码的研究,我将SQLite的查询优总结如下:一、影响查询性能的因素:1. 对表中行的检索数目,越小越好2. 排序与否。3. 是否要对一个索引。4. 查询语句的
2、形式二、几个查询优化的转换1. 对于单个表的单个列而言,如果都有形如T.C=expr这样的子句,并且都是用OR操作符连接起来,形如: x=expr1ORexpr2=xORx=expr3 此时由于对于OR,在SQLite中不能利用索引来优化,所以可以将它转换成带有IN操作符的子句:xIN(expr1,expr2,expr3)这样就可以用索引进行优化,效果很明显,但是如果在都没有索引的情况下OR语句执行效率会稍优于IN语句的效率。2. 如果一个子句的操作符是BETWEEN,在SQLite中同样不能用索
3、引进行优化,所以也要进行相应的等价转换: 如:aBETWEENbANDc可以转换成:(aBETWEENbANDc)AND(a>=b)AND(a<=c)。 在上面这个子句中, (a>=b)AND(a<=c)将被设为dynamic且是(aBETWEENbANDc)的子句,那么如果BETWEEN语句已经编码,那么子句就忽略不计,如果存在可利用的index使得子句已经满足条件,那么父句则被忽略。3. 如果一个单元的操作符是LIKE,那么将做下面的转换:xLIKE ‘abc%’,转换成:x>=‘abc’ A
4、NDx<‘abd’。因为在SQLite中的LIKE是不能用索引进行优化的,所以如果存在索引的话,则转换后和不转换相差很远,因为对LIKE不起作用,但如果不存在索引,那么LIKE在效率方面也还是比不上转换后的效率的。三、 几种查询语句的处理(复合查询)1.查询语句为:ORDERBYORDERBY 执行方法: isoneofUNIONALL,UNION,EXCEPT,orINTERSECT. 这个语句的执行过程
5、是先将selectA和selectB执行并且排序,再对两个结果扫描处理,对上面四种操作是不同的,将执行过程分成七个子过程: outA: 将selectA的结果的一行放到最终结果集中 outB: 将selectA的结果的一行放到最终结果集中(只有UNION操作和UNIONALL操作,其它操作都不放入最终结果集中) AltB: 当selectA的当前记录小于selectB的当前记录 AeqB: 当selectA的当前记录等于selectB的当前记录 AgtB: 当selectA
6、的当前记录大于selectB的当前记录 EofA: 当selectA的结果遍历完 EofB: 当selectB的结果遍历完 下面就是四种操作的执行过程: 执行顺序UNIONALLUNIONEXCEPTINTERSECTAltB:outA,nextAoutA,nextAoutA,nextAnextAAeqB:outA,nextAnextAnextAoutA,nextAAgtB:outB,nextBoutB,nextBnextBnextBEofA:outB,nextBout
7、B,nextBhalthaltEofB:outA,nextAoutA,nextAoutA,nextAhalt 2. 如果可能的话,可以把一个用到GROUPBY查询的语句转换成DISTINCT语句来查询,因为GROUPBY有时候可能会用到index,而对于DISTINCT都不会用到索引的 。四、子查询扁平化 例子:SELECTaFROM(SELECTx+yASaFROMt1WHEREz<100)WHEREa>5 对这个SQL语句的执行一般默认的方法就是先执行内查询,把结果放
8、到一个临时表中,再对这个表进行外部查询,这就要对数据处理两次,另外这个临时表没有索引,所以对外部查询就不能进行优化了,如果对上面的SQL进行处理后可以得到如下SQL语句:SELECTx+yASaFROMt1WHEREz<100ANDa>5,这个结果显然和上面的一样,但此时只需要对数据进行查询一次就够了,另外如果在表t1上有索引的话就避免了遍历整个表。运用flatten方法优化SQL的条件:1.子查询和外查询没有都用集函数2.子查询没有用集函数或者外查询不是个表的连接3.子查询不是一