zoukankan      html  css  js  c++  java
  • 一条经典SQL语句优化实例

     1、概述

    如下SQL语句发生严重消耗资源的问题,使得OS's load average会在30以上,一条语句需要执行上百秒。

    /*
    PIXPatient 184176条
    DomainPatient 184189条
    PersonName 184189条
    */

    捕获的SQL语句:

    select *

    from PIXPatient where PIXPatientTID
    in (select distinct PIXPatientTID from DomainPatient where DomainPatientTID
    in ( select DomainPatientTID from DomainPatient
      where PatientBirthday = '1994-01-09' or PatientBirthday = '1994-01-01'
      union select  DomainPatientTID from PersonName where FamilyName = '倪' or GivenName = '界'));

    2、优化

    a.优化前执行效率:
    mysql>

    select * from PIXPatient where PIXPatientTID
    in (select distinct PIXPatientTID from DomainPatient where DomainPatientTID
    in ( select DomainPatientTID from DomainPatient
      where PatientBirthday = '1994-01-09' or PatientBirthday = '1994-01-01'
      union select  DomainPatientTID from PersonName where FamilyName = '倪' or GivenName = '界'));

    图片
    b.加索引

    alter table PersonName add index Index_FamilyName (FamilyName), add index Index_GivenName (GivenName);
    alter table DomainPatient add index Index_PatientBirthday (PatientBirthday);

    效果不明显

    c.重构SQL语句(优化)
    mysql>

    select * from PIXPatient inner join (
        -> select distinct PIXPatientTID from DomainPatient inner join (
        -> select DomainPatientTID from DomainPatient  where PatientBirthday = '1994-01-09'
        -> union select DomainPatientTID from DomainPatient  where PatientBirthday = '1994-01-01'
        -> union select  DomainPatientTID from PersonName where FamilyName = '倪'
        -> union select  DomainPatientTID from PersonName where GivenName = '界' ) a using(DomainPatientTID) ) b using(PIXPatientTID) ;

    图片
    效果明显

    3、结论
    SQL语句中,尽量避免使用or,in关键字,因为执行效率低。

    规律:
    join > exists > in
    union > or

  • 相关阅读:
    Oracle数据库的非归档模式迁移到归档模式
    对Dataguard的三种模式的理解
    RMAN中建立Catalog 用数据库的例子
    Oracle中实现dblink的作法
    expdp 简单例子
    Oracle单节点_Grid_Infrastructure_DB_安装过程图解(三/三)
    Oracle单节点_Grid_Infrastructure_DB_安装过程图解(一/三)
    Oracle单节点_Grid_Infrastructure_DB_安装过程图解(二/三)
    Oracle 安装过程中 File not found "WFMLRSVCApp.ear" 的原因
    基于Django的在线考试系统
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/6423074.html
Copyright © 2011-2022 走看看