xxgwwj 发表于 2013-1-29 15:22:08

sql性能优化

sql性能优化
对于操作大数据量数据库来说最令人头疼的往往就是性能问题,所以学好sql性能优化极为重要,下面是我总结的几条性能优化方面的经验,仅供大家参考,同时也引以自鉴。
sql通用注意事项:
1.  要少用模糊查询,尽量使用精确查询。如对like后面的值进行匹配查询,是很影响效率的。而平常能用=号的不要用in,能用in的不要用not in。
2.  对于查询某一时间段内的数据时,最好使用between,而不要用>=与<。
3.  建立有效的索引,索引列最好不要有null值,查询时,最好不要对索引列进行计算,加函数,转换数据类型等操作,也不要使用is null ,is not null,in ,not in,or,like,not,<>,!=,因为这些操作都会使索引失效。
4.  or可以使用union或者是in来替代。
5.  对于索引列如需使用in,not in,可以用exists,not exists来代替相关操作。
6.  条件查询时,要弄清字段的数据类型,避免让解析器进行类型转换
7.  要尽量避免使用having子句,可以把having子句条件,转换成where子句的条件。
8.  对于多表查询,最好在对它们进行联接查询前,把每张表的数据量最小化后,再进行查询
9.  在设置where子句缩小结果范围时,不要同时使用group by,而在结果缩小完成以后,再以其为基句进行分组,一般能提高不少效率。
10. 递归查询一般都效率都会比较低,所以要尽量避免使用递归查询。
11.  左连接,右连接一般在表比较单一,数据量比较少的时候进行操作,而(+)往往比join来的效率高。
使用oracle数据库注意事项:
1. Select子句中,不要使用*,因为oracle解析器遇到*,首先要将*解析成该表的列名,而列名需要去数据字典里查询
2. 对于多表查询,最好给每个表都起一个别名,然后在列句前最好能带上表名前缀。
3. 选择最有效的表名顺序,因为oracle的解析器执行顺序一般是从右到左的,所以表名中,排列最后的表反而是第一个被处理的,因此最好选择记录数比较最少的表作为基表进行查询。如果是3张以上的表,就要选择交叉表作为基础表。
4. Where子句中的查询条件,oracle的解析器执行顺序是由后到前的顺序执行的,因此表之前的连接必须写在最后,而能够过滤掉大数据量的条件,也尽量要往后排列。
5. 要少用distinct,union,order by,这些都会引起多次排序,从而影响效率
6.  能用union all时,就用union all,尽量避免用union,因为union会对两个查询结果进行比对排序后,再展示数据,union all则是直接拼接。
7. 可以多用decode,减少对结果的遍历次数。
8. 当处理复杂sql时,可以对多处需要使用到的查询结果建立临时表,以减少反复查询。如果临时表是只在sql内部一次性使用的,可以用with as来创建临时表,如果是在多条sql间均需使用的,可以用select …into语句表创建临时表。注意:创建临时表也是要时间的,所以请慎重选择。
 
页: [1]
查看完整版本: sql性能优化