zoukankan      html  css  js  c++  java
  • 数据库优化SQL

    sql优化规则:

    1.对于查询,尽量不要使用全表扫描,尽量在where子句以及order by所对应的字段建立索引。

    2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。

      最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL

           一些限制索引的写法如下:

       ①使用不等运算符(<> !=)

      ②使用IS NULL或者is notnull做判断。比如NVL等

      ③使用函数

    select  t.* from eb_bill_app t where substr(t.apply_id,1,6) ='201805'

      ④比较不匹配的数据类型.本来该类型为char,却使用int比较,oracle自动调用to_number函数,导致不使用索引(字符型字段为数字时在where条件里不添加引号)。

      ⑤like "%_" 百分号在前。

      ⑥not in ,not exist.

      ⑦单独引用复合索引里非第一位置的索引列

      ⑧B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null   都会走。联合索引 is not null 只要在建立的索引列(不分先后)都会走。

      ⑨应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描

    3.select语句中避免使用*,因为oracle在解析过程中会将*转换为所有的列名。

    4.尽量多使用commit,,在事务控制允许的范围内,commit有利于释放资源。

    5.使用表别名,减少由column引起的歧义。

    6.避免使用having

    7.对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。

    8.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

    9.如果数据量过大,优先考虑表分区

    改造sql示例:数据库中有600万数据左右,仅仅改造一下子查询。查询出来的时间相差很大

    SELECT *
      FROM (SELECT ROW_.*, ROWNUM ROWNUM_
              FROM (SELECT T.*,
                           GY.F_NAME applyOperatorName,
                           CUST.CUST_NAME,
                           (SELECT COUNT(1)
                              FROM BL_STOCKBILL BILL
                             WHERE BILL.BILL_ID IN
                                   (SELECT EXT.BILL_ID
                                      FROM BL_STOCKBILL_EXT EXT
                                     WHERE EXT.PLEDGE_APP_ID = T.PLEDGE_ID
                                       AND EXT.STATUS = '0')) AS BILLS,
                           (SELECT SUM(BILL.BILL_AMT)
                              FROM BL_STOCKBILL BILL
                             WHERE BILL.BILL_ID IN
                                   (SELECT EXT.BILL_ID
                                      FROM BL_STOCKBILL_EXT EXT
                                     WHERE EXT.PLEDGE_APP_ID = T.PLEDGE_ID
                                       AND EXT.STATUS = '0')) AS BILLTOTALAMT
                      FROM EB_BL_PLEDGE_APP T, LSGYZD GY, CUST_BASE CUST
                     WHERE T.APP_OPERATOR = GY.F_GYBH(+)
                       AND CUST.CUST_CODE(+) = T.CUST_CODE
                       AND T.SOURCE_MODEL = '1'
                       AND T.STATUS = '00'
                       AND T.APP_OPERATOR = '6660001'
                       AND T.CUST_CODE = '99100001816') ROW_
             WHERE ROWNUM <= 10)
     WHERE ROWNUM_ > 0;

    耗时:

     优化后:

    SELECT *
      FROM (SELECT ROW_.*, ROWNUM ROWNUM_
              FROM (SELECT T.*,
                           GY.F_NAME applyOperatorName,
                           CUST.CUST_NAME,
                           TMP.BILLS,
                           TMP.BILLTOTALAMT
                      FROM EB_BL_PLEDGE_APP T,
                           LSGYZD GY,
                           CUST_BASE CUST,
                           (SELECT EXT.PLEDGE_APP_ID,
                                   COUNT(1) BILLS,
                                   SUM(BILL.BILL_AMT) BILLTOTALAMT
                              FROM BL_STOCKBILL BILL,BL_STOCKBILL_EXT EXT
                             WHERE BILL.BILL_ID =EXT.BILL_ID
                                  AND  EXT.STATUS = '0'
                                     GROUP BY EXT.PLEDGE_APP_ID) TMP
                     WHERE T.APP_OPERATOR = GY.F_GYBH(+)
                       AND CUST.CUST_CODE(+) = T.CUST_CODE
                       AND T.SOURCE_MODEL = '1'
                       AND TMP.PLEDGE_APP_ID = T.PLEDGE_ID
                       AND T.STATUS = '00'
                       AND T.APP_OPERATOR = '6660001'
                       AND T.CUST_CODE = '99100001816') ROW_
             WHERE ROWNUM <= 10)
     WHERE ROWNUM_ > 0;

     

  • 相关阅读:
    Javascript图片轮播
    Javascript返回顶部
    Android Studio 中 Svn的使用
    js简介
    使用Androd Studio开发Andriod程序查看Sha1的方法
    VueJs学习路线
    Eclipse 项目导入 Studio Debug运行卡死在进入界面
    Node软件的安装
    TextView加边框,自定义,上下左右四条线 颜色,想用哪个用哪个
    安装Eclipse(android)新建项目时遇到的问题
  • 原文地址:https://www.cnblogs.com/lidedong/p/9900726.html
Copyright © 2011-2022 走看看