8. sql优化总结
写高效的sql 语句:ORACLE SQL注意事项
1. 共享SQL语句
当向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。共享的语句必须满足三个条件:
A.字符级的比较:
当前被执行的语句和共享池中的语句必须完全相同.
B. 两个语句所指的对象必须完全相同
C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)
2. 选择最有效率的表名顺序
注:只在基于规则的优化器中有效
3. WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
4. SELECT子句中避免使用'*'
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
5. 计算记录条数
count(*) 比count(1)稍快,区别不是很大,高版本基本没有区别。
6. 用WHERE子句替换HAVING子句
避免使用HAVING子句, HAVING只会在检索出所有记录之后才对结果集进行过滤.
7. 减少对表的查询
如写下列查询条件:
SELECT * FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER) FROM TAB_COLUMNS
8. 用EXISTS替代IN
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.
9. 用表连接替换EXISTS
通常来说, 采用表连接的方式比EXISTS更有效率
10. 用索引提高效
以后详解
11. 用>=替代>
两者的区别在于, 前者DBMS将直接跳到第一个满足条件的记录,而后者将首先定位到条件中的记录并且向前扫描第一个满足条件的记录.
12. 用UNION ALL 替换UNION ( 如果有可能的话)
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序.
如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.