zoukankan      html  css  js  c++  java
  • 使用left join比直接使用where速度快的原因

    多表使用left join只是把主表里的所有数据查询出来,其他表只查询表中的符合条件的某一条记录,所以速度非常快;而多表使用where内联,是把所有表的数据全查出来,然后进行比对,所以速度非常慢。

    使用left join要注意确定哪一张表是主表,如果无法确定主表,则选择哪张表查询的字段最多,就把哪张表作为主表。

    示例如下:

    使用left join,同样的数据量,时间不到1秒钟!

    SELECT a.projectno,MAX(a.projectname) projectname,max(a.projectMoney) projectMoney,
    max(a.projectLimitYear) projectLimitYear,max(a.monthcharge) monthcharge,
    max(c.orgname) orgname,max(d.businesstypename) businesstypename,max(e.name) name,
    max(b.dicvalue) dicvalue,
    min(CONVERT(varchar(100),DATEADD("DAY",jbl.DelayDays,jbl.ReportTime),23)) as period,
    max(f.fiveleveltype) fiveleveltype,max(a.ProjectInfoId) ProjectInfoId,
    max(g.FlowRunId) FlowRunId
    FROM
    (select ProjectInfoId,ProjectNo,Status,OrgId,TypeID,UserAId,IsDelete,ProjectName,ProjectMoney,ProjectLimitYear,MonthCharge from jt_biz_projectinfo) a
    LEFT JOIN
    (select b.* from (select MAX(id) id, ProjectNo from JT_Biz_Lecture group by ProjectNo) a,
    JT_Biz_Lecture b where a.id=b.id) f
    on a.projectno=f.projectno
    LEFT JOIN
    (select DicId,IsDelete,DicValue,DicCode from jt_Base_Dictionary) b
    ON a.status=b.dicId
    LEFT JOIN
    (select ProjectNo,DelayDays,ReportTime from Jt_Biz_LectureTemp) jbl
    ON a.projectno=jbl.projectno
    LEFT JOIN
    (select IsDelete,OrgName,OrgId from jt_base_org) c
    ON a.orgid=c.orgid
    LEFT JOIN
    (select ID,BusinessTypeName from d_businesstype) d
    ON a.typeid=d.id
    LEFT JOIN
    (select UserInfoId,IsDelete,Name,UserName from jt_base_userInfo) e
    ON a.useraid=e.userinfoid
    LEFT JOIN
    (select UserId,PostId,OrgIds from JT_Base_Post_UserOrg) j
    ON j.UserId=e.userinfoid
    LEFT JOIN
    (select PostId from JT_Base_Post) k
    ON j.PostId=k.PostId
    LEFT JOIN
    (select FlowRunId,ProjectId from jt_flow_run) g
    ON a.ProjectInfoId=g.ProjectId
    LEFT JOIN
    (select FlowRunId from JT_Flow_Run_Prcs) h
    ON g.FlowRunId = h.FlowRunId
    LEFT JOIN
    (select OrgId,OrgName from JT_Base_Org) l
    ON a.OrgId=l.OrgId
    WHERE a.status in(82,83,84) and a.isdelete=0
    and b.isdelete=0 and c.isdelete=0 and e.isdelete=0
    and (l.OrgId in(null) or e.UserName='chenqf') group by a.ProjectNo;
    --加快查询速度之对比

    不使用left join,同样数据量,时间大概在50秒的样子!
    select a.projectno,max(a.projectname) projectname,max(a.projectMoney) projectMoney,
    max(a.projectLimitYear) projectLimitYear,max(a.monthcharge) monthcharge,
    max(c.orgname) orgname,max(d.businesstypename) businesstypename,max(e.name) name,
    max(b.dicvalue) dicvalue,
    min(CONVERT(varchar(100),DATEADD("DAY",jbl.DelayDays,jbl.ReportTime),23)) as period,
    max(f.fiveleveltype) fiveleveltype,max(a.ProjectInfoId) ProjectInfoId,
    max(g.FlowRunId) FlowRunId
    from (select DicId,IsDelete,DicValue,DicCode from jt_Base_Dictionary) b,
    (select IsDelete,OrgName,OrgId from jt_base_org) c,
    (select UserInfoId,IsDelete,Name,UserName from jt_base_userInfo) e,
    (select ID,BusinessTypeName from d_businesstype) d,
    (select FlowRunId,ProjectId from jt_flow_run) g,
    (select FlowRunId from JT_Flow_Run_Prcs) h,
    (select UserId,PostId,OrgIds from JT_Base_Post_UserOrg) j,
    (select PostId from JT_Base_Post) k,
    (select OrgId,OrgName from JT_Base_Org) l,
    (select ProjectNo,DelayDays,ReportTime from Jt_Biz_LectureTemp) jbl,
    (select ProjectInfoId,ProjectNo,Status,OrgId,TypeID,UserAId,IsDelete,ProjectName,ProjectMoney,ProjectLimitYear,MonthCharge from jt_biz_projectinfo) a
    left join
    (select b.* from (select MAX(id) id, ProjectNo from JT_Biz_Lecture group by ProjectNo) a,
    JT_Biz_Lecture b where a.id=b.id) f
    on a.projectno=f.projectno where a.status=b.dicId and a.status in(82,83,84)
    and a.projectno=jbl.projectno and a.orgid=c.orgid and a.typeid=d.id
    and a.useraid=e.userinfoid and j.UserId=e.userinfoid and a.isdelete=0
    and b.isdelete=0 and c.isdelete=0 and e.isdelete=0 and g.FlowRunId = h.FlowRunId 
    and (l.OrgId in(null) or e.UserName='chenqf')
    group by a.ProjectNo;

  • 相关阅读:
    Spark技术内幕:Stage划分及提交源代码分析
    从中国制造到中国智造,奥克斯怎样独当一面?
    Spring 类构造器初始化实例
    国庆遐想:漫步云计算数据中心
    osx下快捷键相应符号
    【LuTy推荐】Samba for Android轻松无线访问手机存储,Android安卓软件下载
    WiFi共享精灵官网_笔记本变无线路由器,手机免费wlan上网软件
    vector中的find
    redis web cli nb
    Redis:安装、配置、操作和简单代码实例(C语言Client端)
  • 原文地址:https://www.cnblogs.com/sayhallotoyou/p/4174301.html
Copyright © 2011-2022 走看看