zoukankan      html  css  js  c++  java
  • Oracle sql 优化の常用方式

      1、不要用 '*' 代替所有列名,特别是字段比较多的情况下

      使用select * 可以列出某个表的所有列名,但是这样的写法对于Oracle来说会存在动态解析问题。Oracle系统通过查询数据字典将 '*' 转换成表的所有列名,这自然会消耗系统时间。

      2、进行全表删除时,用truncate代替delete

      当用delete删除表的数据行时,Oracle会使用撤销表空间(UNDO tablespace)来存放恢复的信息。在这期间,如果用户没有发出commit语句,而是发出rollback语句,Oracle系统会将数据恢复到删除之前的状态,当用户使用truncate对表的数据进行删除时,系统不会将被删除的数据写到回滚段(撤销表空间)里,速度自然快些。

      3、在确保完整性的情况下多使用commit

      在PL/SQL块中,经常将几个相互联系的DML语句写到一个BEGIN...END块中,建议在每个DML语句结尾加上commit,这样可以使用对象DML语句及时提交,同时也释放事务所占用的资源。

      4、尽量减少表的查询次数

      在含有多个子查询的sql中,要注意减少对表的查询。
      示例:

        --Inefficient sql
        select tab_name1,tab_name2 from table_name 
        where tab_name1 = (select tab_n1 from table_n)
           and tab_name2 = (select tab_n2 from table_n)
        --Efficient sql
        select tab_name1,tab_name2 from table_name 
        where (tab_name1,tab_name2)= (select tab_n1,tab_n2 from table_n)
    

      5、使用exists代替in,使用not exists代替not in

      在子查询中,in使用一个内部的排序和合并,无论在哪种情况下,not in都是最低效的,因为它对子查询中的表执行了全表遍历,为了避免使用not in,我们可以把它改写为外连接(outer join)或者是not exists。但并不代表not in 完全不可用,我们一分为二来看待此问题:若子查询返回的数据集较复杂,避免使用not in;当子查询返回的数据集较简单或者可枚举,not in也可以使用。

      exists和in使用同理。

      6、合理使用函数

      不合理的函数使用方式会对数据库造成严重的性能问题,即使一个非常简单的函数,因为其使用不当,都可能造成严重的后果。

      示例:

        --Inefficient sql
        for i in 0...10 LOOP
          select count(*) into i_cnt from race_results
          where horse_name = format_name('xiaobai');
        end LOOP;
        --Efficient sql
        for i in 0...10 LOOP
          select count(*) into i_cnt from race_results
          where horse_name = (select format_name('xiaobai') from dual);
        end LOOP;

      当函数在where子句中使用时,查询结果得到的每一行记录均会调用该函数一次。

      7、正确选择from表顺序

      在基于规则的优化器(Rule-based Optimizer)下,Oracle解析器按照从右至左的顺序处理from后的表名,因此写在from中最后的表将会被先处理,先处理的表也称为驱动表,在from子句中包含多个表的情况下,建议选择数据量最少的表作为驱动表。原因:当Oracle处理多个表时,会运用排序或合并的方式连接它们。首先,系统扫描from中最后的表,并对该表的数据进行排序;然后,扫描from中倒数第二个表;最后,将所有从第二个表中检索出来的记录和第一个表中的合适记录进行合并,取交集。

      如果有三个以上的表连接,则建议使用交叉表(intersection table)作为驱动表,所谓交叉表指的是被其他表所引用的表。

      8、where子句条件的连接顺序

      Oracle采用自下而上顺序解析where子句,按照这个原理,表连接的条件必须写在其他条件之前,那些能过滤掉最大记录的条件必须写在where子句的末尾,也就是表在连接操作以前,能过滤的数据量越大越好。

  • 相关阅读:
    TensorFlow分布式在Amazon AWS上运行
    在C++中加载TorchScript模型
    java 在 linux 持续运行 并不让其输出日志
    reactor.core.Exceptions$OverflowException: Could not emit tick 1 due to lack of requests (interval doesn't support small downstream requests that replenish slower than the ticks)
    https://gitee.com/createmaker/webflux-r2dbc-demo-pri
    清晨与暮霭 : 清晨,我睁开惺忪得眼睛,望向初升的朝阳,感受温暖. 暮霭,聆听风的私语,感受万籁俱寂.
    https://gitee.com/createmaker/eventbus-demo
    Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
    只是习惯,改掉就好,只是不习惯,习惯了就好
    从游戏角度了解RxJava
  • 原文地址:https://www.cnblogs.com/tomcatx/p/4802554.html
Copyright © 2011-2022 走看看