sql优化
1.select字句中不要使用*
理由:
把*替换成表中的字段名,需要解析一次数据字典,有性能损耗
不便于pojo的升级维护,比如表中增加字段,使用*,就必须去升级该表映射的所有POJO
多余的字段会增加传输的成本
2.where条件连接列不会使用索引,例如:where column1 || '' || column2 = 'value1value2'
3.like查询在查询列左边使用%不会使用索引
4.order by 后不要写表达式,尽量用索引列排序
5.对于number类型的字段进行不等于判断的时候不使用索引,更好的做法是小于或大于,例如 salary < 5000 or salary > 5000
6.from字句后的主表最好是记录数最少的表
7.子查询不易嵌套过多层
8.where字句中过滤范围大的条件放在where末尾
9.任何存在null值的列,都不会用索引
10.使用case when语句替代行转列时的聚合函数,可以减少不必要的表关联
例如:求部门1和部门2的员工人数
SELECT
SUM(CASE WHEN (e.department_id = 1) THEN 1 END) AS dept1Count,
SUM(CASE WHEN (e.department_id = 2) THEN 1 END) AS dept2Count
FROM test_employee e
11.子查询,内大exists,外大in,无论何时not exists 比 not in速度快
理由:
*exists迭代的是外表,如果外表数据量大,则迭代次数增加,效率降低,exists不适用于外表数据量较大的情况
*in迭代的是内表,如果内表数据量大,则迭代次数增加,in不适用于内表数据量较大的情况
*not in 内外全表扫描,效率低
*not exists 会使用到子表的索引,效率高
12.where后的子查询,尽量减少对同一张表的查询次数
例如:
高效:where (column1,column2) = (select column1,column2 from tablename)
低效:where column1= (select column1 from tablename) and column2= (select column2 from tablename)
13.sql语句中使用表别名可以减少字段解析时间