我们要做到不但会写 SQL,还要做到写出性能优良的 SQL,以下为笔者学习、摘录、并汇总部
分资料与大家分享!
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):
ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,FROM 子句中写在最后的
表(基础表 driving table)将被最先处理,在 FROM 子句中包含多个表的情况下,你必须选择记
录条数最 少的表 作为基 础表。 如果有 3 个以 上的表 连接查 询, 那就需 要选择 交叉表
(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
(2) WHERE 子句中的连接顺序.:
ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写在其他
WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾.
(3) SELECT 子句中避免使用 ‘ * ‘:
ORACLE 在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完
成的, 这意味着将耗费更多的时间
(4) 减少访问数据库的次数:
ORACLE 在内部执行了许多工作: 解析 SQL 语句, 估算索引的利用率, 绑定变量 , 读数据块
等;
(5) 在 SQL*Plus , SQL*Forms 和 Pro*C 中重新设置 ARRAYSIZE 参数, 可以增加每次数
据库访问的检索数据量 ,建议值为 200
(6) 使用 DECODE 函数来减少处理时间:
使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表.
(7) 整合简单,无关联的数据库访问:
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有
关系)
(8) 删除重复记录:
最高效的删除重复记录方法 ( 因为使用了 ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用 TRUNCATE 替代 DELETE:
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信
息. 如果你没有 COMMIT 事务,ORACLE 会将数据恢复到删除之前的状态(准确地说是恢复到执
行删除命令之前的状况) 而当运用 TRUNCATE 时, 回滚段不再存放任何可被恢复的信息.当命
令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE 只
在删除全表适用,TRUNCATE 是 DDL 不是 DML)
(10) 尽量多使用 COMMIT:
只要有 可能,在 程序中 尽量 多使用 COMMIT, 这样程序 的性 能得到 提高, 需 求也 会因为
COMMIT 所释放的资源而减少:
COMMIT 所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE 为管理上述 3 种资源中的内部花费
(11) 用 Where 子句替换 HAVING 子句:
避免使用 HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理
需要排序,总计等操作. 如果能通过 WHERE 子句限制记录的数目,那就能减少这方面的开销.