总则
1. SQL优化要区分数据库
基础
1. 书写
语句用大写
2. SELECT
避免使用“*”
移除不必要的字段
3. FROM:FROM语句从后向前处理
选择最有效率的表名顺序
选择“基础表”放置于末尾
在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表
有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表
使用表“别名”
移除不必要的表
4. WHERE:WHERE从下往上执行
将表之间的连接必须写在其它WHERE条件之前
将可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
5. 其它
使用不同的“表空间”
索引
在SQL语句的WHERE和JOIN部分中用到的所有字段上,都应该加上索引。
不要把存在控制的列作为索引
注:监视索引是否被使用
-- 设置监视索引IDX_XXX alter index IDX_XXX monitoring usage; -- 检查索引使用情况 select * from v$object_usage;
子查询
在内部语句上使用过滤,而不是在外部语句上。
操作符
IN -> EXISTS
用EXISTS 方案代替
NOT IN
采用NOT EXISTS
IS NULL 或IS NOT NULL操作
UNION
UNION ALL
“>”、“<”
用“>=”、“<=”替换
最小数据集
临时表