从实际项目中总结出的20条数据库操作优化经验

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

2-5是不适用索引而进行全表扫面的情况:

2.ISNULL和ISNOTNULL

不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,,即使对该列建索引也不会提高性能。任何在where子句中使用isnull或isnotnull的语句优化器是不允许使用索引的。

3.联接的列

对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。select*fromemploysswherefirst_name||”||last_name=’BeillCliton’;系统优化器对基于last_name创建的索引没有使用。

4.避免在索引列上使用计算.如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描:低效:SELECT…FROMDEPTWHERESAL*12>25000;高效:SELECT…FROMDEPTWHERESAL>25000/12;

5.NOT

…wherenot(status=’VALID’)

select*fromemployeewheresalary<3000orsalary>3000;

虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

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

7.WHERE子句中的连接顺序:

8.SELECT子句中避免使用‘*‘:

9.减少访问数据库的次数:

10.用TRUNCATE替代DELETE:

11.尽量多使用COMMIT:

12.用Where子句替换HAVING子句:

13.通过内部函数提高SQL效率.:

14.使用表的别名(Alias):

15.用EXISTS替代IN、用NOTEXISTS替代NOTIN:

16.用EXISTS替换DISTINCT:

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

18.用WHERE替代ORDERBY:DEPT_CODEPKNOTNULLDEPT_DESCNOTNULLDEPT_TYPENULLSELECTDEPT_CODEFROMDEPTORDERBYDEPT_TYPESELECTDEPT_CODEFROMDEPTWHEREDEPT_TYPE>0

19.避免使用耗费资源的操作:

优化GROUPBY:低效:高效:

如果有可能,我带你去远行。

从实际项目中总结出的20条数据库操作优化经验

相关文章:

你感兴趣的文章:

标签云: