日期:2014-05-16  浏览次数:20437 次

数据库优化之我见
a. 数据库配置
   包括sga配置:数据缓存,共享池等。
      数据缓存可以根据需要来设定缓存策略,比如keep,recyle,defaultcelve。
      共享池的库缓存与sql的缓存相关。
b. 表结构的设计
    主键外键,索引。
    纵向拓展:表分区,垂直分库
    横向拓展:表分片

c. sql优化
    访问Table的方式
3.       共享SQL语句
4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)
5.       WHERE子句中的连接顺序.
6.     SELECT子句中避免使用 ‘ * ‘
7.     减少访问数据库的次数
    当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算
    索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的
    次数 , 就能实际上减少ORACLE的工作量.
10.       删除重复记录

最高效的删除重复记录方法 ( 因为使用了ROWID)

DELETE FROM EMP E

WHERE E.ROWID > (SELECT MIN(X.ROWID)

                   FROM EMP X

                   WHERE X.EMP_NO = E.EMP_NO);

11.       用TRUNCATE替代DELETE
    当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息.
    如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)

    而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.
    因此很少的资源被调用,执行时间也会很短.

(译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
14.       用Where子句替换HAVING子句

     避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理
     需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.

例如:

     低效:

     SELECT REGION,AVG(LOG_SIZE)

     FROM LOCATION

     GROUP BY REGION

     HAVING REGION REGION != ‘SYDNEY’

     AND REGION != ‘PERTH’

     高效

     SELECT REGION,AVG(LOG_SIZE)

     FROM LOCATION

     WHERE REGION REGION != ‘SYDNEY’

     AND REGION != ‘PERTH’

     GROUP BY REGION

(译者按: HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中)

15.       减少对表的查询

在含有子查询的SQL语句中,要特别注意减少对表的查询.  
17.       使用表的别名(Alias)

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

索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个
复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找
出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多
个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的
唯一性验证.

除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型
表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提
高效率.

虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来

存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修
改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O .
因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.

译者按:

定期的重构索引是有必要的.

ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>

26.       索引的操作

ORACLE对索引有两种访问模式.

索引唯一扫描 ( INDEX UNIQUE SCAN)

大多数情况下, 优化器通过WHERE子句访问INDEX.

例如:

表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER. 

SELECT *

FROM LODG