避免在索引列上使用函数或者表达式 举例:SELECT CONTNO FROM Person WHERE TRIM(name) = ‘张三’,name是索引列,使用函数后,会导致索引失效。
用not exists代替 not in、用decode代替case when、用UNION替换OR
多表联查时必须存在准确的关联条件,避免出现笛卡尔积 举例:SELECT A.name FROM Student A,Person B WHERE B.age = ‘20’,由于AB没有明确关联,会产生巨量(A表总条数*B表符合条件的总条数)的查询结果。
应尽量避免在where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及orderby 涉及的列上建立索引。
应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num is null。可以在num 上设置默认值0,确保表中num 列没有null 值,然后这样查询:select id from t where num=0
尽量避免在where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描, 如:select id from t where num=10 or num=20。 可以这样查询: select id from t where num=10 union all select id from t where num=20
尽量少用(或者不用)sqlserver 自带的函数 select id from t where substring(name,1,3) = ’abc’ select id from t where datediff(day,createdate,’2005-11-30′) = 0 可以这样查询: select id from t where name like ‘abc%’ select id from t where createdate >= ‘2005-11-30’ and createdate < ‘2005-12-1’
连续数值条件,用BETWEEN 不用IN: SELECT id FROM t WHERE num BETWEEN 1 AND 5