`
lvwenwen
  • 浏览: 931732 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

数据库优化(sql优化)

阅读更多
数据库优化(sql优化)
1.sql优化:
1.选择最有效的表名顺序(仅适用于RBO模式)将表上记录最少的那个表置于FROM的最右端作为基表。Oracle会首先扫描基表(FROM子句中最后的那个表)并对      
记录进行排序
2.select 查询中避免使用'*',*被解析成具体的字段,浪费内存
3.减少访问数据库的次数                                                                   
4) 使用DECODE函数来减少处理时间                               
-->使用decode函数可以避免重复扫描相同的行或重复连接相同的表
用Where子句替换HAVING子句                                                                                                   
-->尽可能的避免having子句,因为HAVING 子句是对检索出所有记录之后再对结果集进行过滤。这个处理需要排序,总计等操作                
-->通过WHERE子句则在分组之前即可过滤不必要的记录数目,从而减少聚合的开销
使用表别名 用EXISTS替代IN                                                                                  
    在一些基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下,使用EXISTS(或NOT EXISTS)通常       
将提高查询的效率.         
合理使用索引以提高性能
    虽然使用索引能得到查询效率的提高,但是索引需要空间来存储,需要定期维护.尤其是在有大量DML操作的表上,任意的DML操作都将引起索
引的变更这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O 因此定期的重构索引是有必要的.
                                                                        
索引的情况:
WHERE  employee_id + 10 > 150;        -->索引列上使用了计算,因此索引失效,走全表扫描方式  
) 避免在索引列上使用NOT运算或不等于运算(<>,!=)                                                                                  
通常,我们要避免在索引列上使用NOT或<>,两者会产生在和在索引列上使用函数相同的影响。 当ORACLE遇到NOT或不等运算时,他就会停止       
使用索引转而执行全表扫描。                    
WHERE  NOT ( deptno = 20 );
WHERE  deptno > 20 OR deptno < 20;
-->尽管此方式可以替换且实现上述结果,但依然走全表扫描,如果是单纯的 > 或 < 运算,则此时为索引范围扫描   
避免索引列上使用函数 此时索引失效,使用全表扫描         
WHERE子句中的连接顺序
     ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
6.SELECT子句中避免使用 ' * '
     当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中,会将'*' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。
7.减少访问数据库的次数
     当执行每条SQL语句时,ORACLE在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。
8.使用DECODE函数来减少处理时间
17.使用表的别名(Alias)
用EXISTS替代IN
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics