1.选择最有效率的表名顺序
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。
当ORACLE处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
只在基于规则的优化器中有效。
举例:
表 TAB1 100000 条记录
表 TAB2 100 条记录
/*选择TAB2作为基础表 (最好的方法)*/
select count(*) from tab1,tab2 执行时间0.86秒
/*选择TAB2作为基础表 (不佳的方法)*/
select count(*) from tab2,tab1 执行时间29.77秒
2.使用Truncate而非Delete
Delete表中记录的时候,Oracle会在Rollback段中保存删除信息以备恢复。Truncate删除表中记录的时候不保存删除信息,不能恢复。因此Truncate删除记录比Delete快,而且占用资源少。
删除表中记录的时候,如果不需要恢复的情况之下应该尽量使用Truncate而不是Delete。
Truncate仅适用于删除全表的记录。
3. SELECT子句中避免使用“*”
Oracle在解析SQL语句的时候,对于“”将通过查询数据库字典来将其转换成对应的列名。
如果在Select子句中需要列出所有的Column时,建议列出所有的Column名称,而不是简单的用“”来替代,这样可以减少多于的数据库查询开销。
4. 用Where子句替换Having子句
避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序、总计等操作。如果能通过WHERE子句限制记录的数目,就能减少这方面的开销。
5. 使用表的别名(Alias)
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属。
6.用 >= 替代 >
如果DEPTNO上有一个索引
高效:
SELECT *
FROM EMP
WHERE DEPTNO >=4
低效:<