那些高性能的SQL语句编写的事

来源:互联网 发布:python 推荐系统库 编辑:程序博客网 时间:2024/06/15 09:15

    1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

     2的例子

     

    2.多表关联查询时,主表放在最后。

    --------------------------------- 修改前 ----------------------------------------

    select /*+rule*/

           b.bill_pract_num,

           t.insert_by,

           t.login_id,

           b.bp_header_id

    from zte_sie_image_uploads t, zte_sie_bp_headers b

    where t.enabled_flag = 'Y'

     and t.job_status IN ('-2', 'BUILDED', '-1')

     and t.insert_date > sysdate - 30

     and t.job_number = b.bill_pract_num -- 实物票据号(影像分组号)

     and b.enabled_flag = 'Y'

     and b.bill_status = '205_HQ_INCEPT'

    --------------------------------- 修改后 ----------------------------------------

    select /*+rule*/

           b.bill_pract_num,

           t.insert_by,

           t.login_id,

           b.bp_header_id

      from zte_sie_bp_headers b, zte_sie_image_uploads t

     where 1=1

       and b.enabled_flag = 'Y'

       and b.bill_status || '' = '205_HQ_INCEPT'

       and b.bill_pract_num = t.job_number

       AND t.enabled_flag = 'Y'

       and t.job_status IN ('-2', 'BUILDED', '-1')

       and t.insert_date > sysdate -30

    3.一般情况下 [not ]exists[not ]in效率会高,因为exists是通过比较,相同即返回结果,而in会先返回子查询结果,然后再进行对比。

     

    4.>=<=><效率高,如下示例:查询时,a会首先定位到3的记录,然后向前移去扫描对应的记录,而b则直接跳到4的记录,然后扫描对应的记录。

     

    a.SELECT * FROM EMP WHERE DEPTNO >3

     

    b.SELECT * FROM EMP WHERE DEPTNO >=4

     

    5.多表关联时使用别名,这样做能提高sql解释的效率,同时可以规避掉列名重名的问题。

    6.查询时尽量不用*,最好具体到需要查询的字段。INSERT时,把字段列出来,避免改表结构后发生错误。

    7.若一个小表必须关联另外的大表才能查出相应的结果,可以将大表先子查询再来进行关联,不要一下子全部关联在一起。

     

    SELECT1

      FROM zte_fbp_bank_accounts bb,

           (SELECT bau.bank_account_id

              FROM zte_fbp_bank_account_uses bau

             WHERE bau.enabled_flag = 'Y'

               AND bau.use_id = 1

               AND bau.use_type = 'ORG') a

     WHERE bb.enabled_flag = 'Y'

       AND TRIM(bb.bank_name) = TRIM('招商银行')

       AND bb.bank_account_id = a.bank_account_id

     

    8.某些表查询小量数据,但必须和别的表关联才能出数据

    --------------------------------- 反例 ----------------------------------------

       SELECT DISTINCT d.dept_id,d.dept_name

     FROM dept d,emp e

    WHERE d.dept_id = e.dept_id;

     

    --------------------------------- 正例 ----------------------------------------

      SELECT dept_id,dept_name

    FROM dept d

         WHERE EXISTS (SELECT 1

    FROM emp e

    WHERE e.dept_id = d.dept_id);

    9.递归时,使用start  with xx connect by xxx语句。

    10. order by不是特殊需要时、尽可能扔掉。

     

     

     

0 0
原创粉丝点击