-
几个查询优化的转换-线性代数及其应用中文版下载
资源介绍
二、几个查询优化的转换
1. 对于单个表的单个列而言,如果都有形如 T.C=expr 这样的子句,并且都是用 OR操作符连接起
来,形如: x = expr1 OR expr2 = x OR x = expr3 此时由于对于 OR,在 SQLite 中不能利用索引
来优化,所以可以将它转换成带有 IN操作符的子句:x IN(expr1,expr2,expr3)这样就可以用索引进
行优化,效果很明显,但是如果在都没有索引的情况下 OR语句执行效率会稍优于 IN语句的效率。
2. 如果一个子句的操作符是 BETWEEN,在 SQLite中同样不能用索引进行优化,所以也要进行相应
的等价转换: 如:a BETWEEN b AND c 可以转换成:(a BETWEEN b AND c) AND (a>=b) AND (a<=c)。
在上面这个子句中, (a>=b) AND (a<=c)将被设为 dynamic 且是(a BETWEEN b AND c)的子句,那么
如果BETWEEN语句已经编码,那么子句就忽略不计,如果存在可利用的 index使得子句已经满足条件,
那么父句则被忽略。
3. 如果一个单元的操作符是 LIKE,那么将做下面的转换:x LIKE ‘abc%’,转换成:x>=‘abc’
AND x<‘abd’。因为在 SQLite 中的 LIKE是不能用索引进行优化的,所以如果存在索引的话,则转
换后和不转换相差很远,因为对 LIKE不起作用,但如果不存在索引,那么 LIKE 在效率方面也还是比
不上转换后的效率的。
三、 几种查询语句的处理(复合查询)
1.查询语句为: ORDER BY ORDER BY
执行方法: is one of UNION ALL, UNION, EXCEPT, or INTERSECT. 这个语句的执行过
程是先将 selectA和 selectB 执行并且排序,再对两个结果扫描处理,对上面四种操作是不同的,将
执行过程分成七个子过程:
outA: 将 selectA的结果的一行放到最终结果集中
outB: 将 selectA的结果的一行放到最终结果集中(只有 UNION操作和 UNION ALL操作,其
它操作都不放入最终结果集中)
AltB: 当 selectA 的当前记录小于 selectB 的当前记录
- 上一篇: 总结及未来的路-线性代数及其应用中文版
- 下一篇: 基本流程-线性代数及其应用中文版