多表使用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;

使用left join比直接使用where速度快的原因相关推荐

  1. Redis 速度快的原因

    文章目录 基于内存实现 高效的数据结构 SDS 1. 字符串长度处理 2. 内存重新分配 3. 不需要处理二进制安全 '\0' 双端链表 1. 前后节点 2. 头尾节点 3. 链表长度 压缩列表 字典 ...

  2. kafka读写速度快的原因

    KAFKA是分布式发布-订阅消息系统,是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. 现在被广泛地应用于构建实时数据管道和流应用的场景中,具有横向扩展,容错,快等 ...

  3. mybatis比hibernate处理速度快的原因

    mybatis:是面向结果集的.当要展示的页面需要几个字段时,springmvc会提供这几个字段并将其拼接成结果集,在转化为相应的对象. hibernate:是面向对象的.要展示的页面需要某些字段时, ...

  4. android手机与苹果手机,苹果手机和安卓手机,速度大比拼,速度快有原因

    为什么安卓手机的运行速度永远赶不上苹果IPhone?目前最高才使用六GB的运行内存,而安卓十二GB都不算高.有些人会说苹果之所以流畅就是因为它的系统,这句话不讲,但是确实有一点外行,今天咱们就来深入的 ...

  5. Kafka速度快的原因-sendfile零拷贝介绍

    所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手.零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换.对 Linux 操作系统而言,零拷贝技术依赖于底层 ...

  6. 为什么是string.join(list)而不是list.join(string)?

    这一直使我感到困惑. 看起来这样会更好: my_list = ["Hello", "world"] print(my_list.join("-&quo ...

  7. Mysql 优化器内部JOIN算法hash join Nestloopjoin及classic hash join CHJ过程详解

    Mysql hash join之classic hash join CHJ过程详解 hash join的历史 优化器里的hash join算法在SQL Server.Oracle.postgress等 ...

  8. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

  9. left join不起作用

    一.left join的目的 一般在sql语句中使用leftjoin目的是让左表为主,右表链接,可是有的时候,我们发现leftjoin的效果和INNER JOIN 的效果一样,是什么原因导致的呢. 二 ...

最新文章

  1. 使用git上传代码到github
  2. c语言图形化编程入门_C语言C++新手入门,VS2013编程器安装教程
  3. RH413-测试文件的a属性
  4. Oracle学习(五)DBLINK
  5. Psych101(part7)--Day7
  6. uiautomator2进阶
  7. 2004-4-3+ asp.net编程环境的配置
  8. MFC消息映射与消息传递内幕
  9. 有人用语音识别写作吗,如果没有,为什么?
  10. 2 Django-2的路由层(URLconf)
  11. HTML(三)选择器--复杂选择器
  12. 永久删除暴风影音服务项,去除 stormliv.exe 进程
  13. web页面视频播放器选型
  14. 文件同步工具 GoodSync Enterprise 破解
  15. python中ix用法_在python的pandas模块中,DataFrame对象,如何选择一行?索引、loc、iloc、ix的用法及区别...
  16. 使用husky + lint-staged助力团队编码规范
  17. git踩坑——中途才使用.gitignore文件
  18. 数学公式快速计算方法
  19. 人员离职it检查_经典的it公司员工离职报告范文
  20. 紫书 统计字符1的个数

热门文章

  1. C++ 读取asar中的文件
  2. kindle kw3 ttl刷机救砖
  3. 浅谈Go的Context相关方法
  4. Android 组件化面试必备(1),Android面试题2020
  5. Spring Form Tags
  6. 如何在线将PDF转Word?这样转换了解一下
  7. 常见算法思路及技巧总结一
  8. win7关闭系统安装更新方法
  9. Linux常用命令---groupadd,useradd(一)
  10. ZuulFilter过滤器