• 使用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;

  • 相关阅读:
    [Leetcode]-- Largest Rectangle in Histogram
    Trapping Rain Water
    JNI和JNA性能比较
    Visual Studio开发Linux程序的方法
    Linux查看机器的硬件信息
    各语言的代码混淆工具
    类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast区别
    内存泄露的监测工具
    我们三十以后才明白
    我们三十以后才明白
  • 原文地址:https://www.cnblogs.com/sayhallotoyou/p/4174301.html
Copyright © 2020-2023  润新知