如何优化 sql

1. 选择最有效率的表名顺序(只在基于规则的优化器中有效)

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的
表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须
选择记录条数最少的表作为基础表。如果有3个以上的表连接查询,那就需要选择交叉
表(intersectiontable)作为基础表, 交叉表是指那个被其他表所引用的表

2. 注意 WHERE子句中的连接顺序.

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必 须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE 子句的末尾

3. SELECT子句中避免使用‘ * ‘

ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过 查询数据字典完成的, 这意味着将耗费更多的时间

4. 减少访问数据库的次数

ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变 量 , 读数据块等

5. 整合简单,无关联的数据库访问

6. 用索引提高效率

索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复 杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找 出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结 多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键 (primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎 所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小 表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们 也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在 表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存 储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引 是有必要的.: ALTER INDEX REBUILD

7. 使用表的别名(Alias)

当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column 上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误

8. 总是使用索引的第一个列

如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引

参考文章


已有 0 条评论

    我有话说: