|
6. 用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS,或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
例子:(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE
DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')
7. 合理的使用索引提高查询效率
在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5
次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。
8. 索引列失效情况
我们要避免在索引列上使用NOT,函数,‘!=’,‘||’运算符, 如果使用了就会导致索引列失效. 他就会停止使用索引转而执行全表扫描.
避免在索引列上使用IS NULL和IS NOT NULL
尽量使用前端匹配的模糊查询(like),以通过使用索引来避免全表扫描。例如,column1 like ‘ABC%’方式,可以对column1字段进行索引范围扫描;而column1 like ‘%ABC%’方式,即使column1字段上存在索引,也无法使用该索引,只能走全表扫描。
9. 用>=替代>
高效: SELECT * FROM EMP WHERE DEPTNO >=4 ;
低效: SELECT * FROM EMP WHERE DEPTNO >3 ;
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录. |
|
|