分类: Oracle DB |
1.观察一番:
1) 最低效的子查询
2) 执行计划中全表扫描的Table/View
3) 只查找一个栏位,并且不包含过滤条件的Table/View
4) Index是不是失效
5) from中的子查询+外联接,替换成select中的子查询看看
2.尝试一下:
1) 用Exist代替In,用In代替Or(不过要看索引情况)
2) 给每个栏位前引用table别名
3) select * 没意义
4) Union all 代替Union(Union要排序后筛选掉相同数据,肯定会慢)
5) 少用order by / distinct / group by
6) 用where 代替 having
7) where order从下往上
8) 外联接可以与select子查询互换(非from子查询)
2) 给每个栏位前引用table别名
3) select * 没意义
4) Union all 代替Union(Union要排序后筛选掉相同数据,肯定会慢)
5) 少用order by / distinct / group by
6) 用where 代替 having
7) where order从下往上
8) 外联接可以与select子查询互换(非from子查询)
9) LIKE有时可以换成SUBSTR()函数
10)两种互换:
当Table只作为筛选条件使用时,可以用EXIST (SELECT 'x' FROM table_name WHERE
condition)替换整张表的串联;
当Table只抓一个栏位且不作为筛选条件的时候,使用SELECT中的子查询去替换整张表的串联
3.意想不到的:
1) where条件的顺序
2) Order by对速度的影响
3) 在View中若使用了不含动态SQL的 Package/function 得到栏位值可能会慢
4)
虽然Oracle常常用Count(1)判断存在性,但是目前我验证的结果是,Count(1)跟Count(*)效能差不多,跟select
...where rownum = 1也差不多,但是,Count(某一栏位)确实会比较慢~~