对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引。

问题:

大量的left join 怎么优化
select a.id,a.num,b.num,b.pcs,c.num,
c.pcs,d.num,d.pcs,e.num,e.pcs,a.x,
a.y from a left join b.id=a.id and b.time=a.time
left join c.id=a.id and b.time=a.time
left join d.id=a.id and b.time=a.time
left join e.id=a.id and b.time=a.time
where a.time='2013-10-1'
这样查询效率很低,要几十分钟才能出laugh数据~每张表有上千万条数据,求问该如何优化?

答案:

在各个表的id和time属性上创建索引,而且把其中除了第一次left join中的 b.time=a.time外,其余的 b.time=a.time去掉,并先对b表执行    b.time='2013-10-1'的查询。
如果各表都需要判断时间的话,那么请先在各表上执行基于时间的选择操作,在参加左外连接。因此,时间字段上的索引很重要。

实例:自己实践经验:

select  --------------------------首先各个物料在各个期间的返利金额,然后根据每个期间求出对应每个月的返利总和-----------------------------------
    GZB.customer,GZB.company,GZB.jt,GZB.pz,
    ' then GZB.sl*GZB.fldj end) 二月,
    ' then GZB.sl*GZB.fldj end) 四月,
    ' then GZB.sl*GZB.fldj end) 六月,
    ' then GZB.sl*GZB.fldj end) 八月,
    ' then GZB.sl*GZB.fldj end) 十月,
     ,)), ,))
    from
    (        ----------------------------先把每个物料的返利单价,和对应的期间算出来------------------------
    select
    wldw.lswldw_dwmc customer,dw.lsbzdw_dwmc company,org.organizationname jt,ms.materialsortname pz,
    gs.issfiscalperiod qj,nvl(gm.actoutquantity,) sl,))))))) fldj
    from goodsmovement gs
    left join goodsmovementitem gm on gs.goodsmovementid=gm.goodsmovementid
    left join lswldw wldw on wldw.lswldw_wldwbh=gs.customerid
    left join lsbzdw dw on dw.lsbzdw_dwbh=gs.isscompanyid
    left join organizations org on gs.issorgid=org.organizationid                       --生产机台
    left join materials m on m.materialid=gm.materialid
    ,)
    ,)'
    '
    group by  wldw.lswldw_dwmc,dw.lsbzdw_dwmc,org.organizationname,ms.materialsortname ,
    gs.issfiscalperiod ,nvl(gm.actoutquantity,)
    ) GZB
    group by GZB.customer,GZB.company,GZB.jt,GZB.pz;

对于这段SQL,自己查询需要等待14秒出来结果。

但是给各表的关联字段上添加索引之后:

    create index gs_index on goodsmovement(goodsmovementid)
    create index gm_index on goodsmovementitem(goodsmovementid)
    create index gs_index1 on goodsmovement(customerid)
    create index gs_index2 on goodsmovement(isscompanyid)
    create index gs_index3 on goodsmovement(movetypeid)
    create index gs_index4 on goodsmovement(issorgid)

    create index dwbh on lswldw (lswldw_wldwbh)

查询速度大大提高:只需要0.17秒,快了几百倍!

对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引。的更多相关文章

  1. mybatis逆向工程,实现join多表查询,避免多表相同字段名的陷阱

    ​ mybatis逆向工程,实现join多表查询,避免多表相同字段名的陷阱 ​ 前言:使用 mybatis generator 生成表格对应的pojo.dao.mapper,以及对应的example的 ...

  2. Django ORM queryset object 解释(子查询和join连表查询的结果)

    #下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) --- ...

  3. mysql中各种join连表查询总结

    通常我们需要连接多个表查询数据,以获取想要的结果. 一.连接可以分为三类: (1) 内连接:join,inner join (2) 外连接:left join,left outer join,righ ...

  4. LEFT JOIN 多表查询的应用

    表结构如下:只把主要字段列出 表一:付款记录表  Gather 字段:GatherID , AccountID, PayMents 金额, PayWay  付款方式 1 现金 2 刷卡 表2:销售记录 ...

  5. sql多表查询时怎么获取查到的字段

    首先,多表查询不能用hql(貌似hql就是不支持多表查询,如果可以,希望看到的朋友给个例子) List list = systemService.findListbySql("SELECT ...

  6. mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】

    1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tablename2: 注意这个操作必须保证两 ...

  7. Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询

    1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tablename2: 注意这个操作必须保证两 ...

  8. oracle锁表查询,资源占用,连接会话,低效SQL等性能检查

    查询oracle用户名,机器名,锁表对象 select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user ...

  9. 【mysql】mysql中单列索引、联合索引、Join联表查询建立索引 和 EXPLAIN的分析使用

    2.创建联合索引,从坐到右分别为:userid.openId.name   2. #### --------------  多表联合查询 update 2019/03/13  ------------ ...

随机推荐

  1. mac安装Aws cli失败

    OS X EI 10.11 报错信息如下: Found existing installation: six 1.4.1 DEPRECATION: Uninstalling a distutils i ...

  2. SwipeBackActivity 的使用

    1.SwipeBackLayout 项目地址:https://github.com/ikew0ng/SwipeBackLayout 2.用法 android studio  compile 'me.i ...

  3. 【原】iOS容易造成循环引用的三种场景,就在你我身边!

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都同 ...

  4. SQL server 2014安装以及解决连接数据库失败问题

    安装教程:http://jingyan.baidu.com/article/3a2f7c2e653d5926afd61197.html 安装好之后打开SQL server 2014 Managemen ...

  5. MVC数据库数据分页显示

    首先从数据库获取数据 using System; using System.Collections.Generic; using System.Linq; using System.Web; usin ...

  6. MySQL 数据库双向镜像、循环镜像(复制)

    在MySQL数据库镜像的贴子中,主数据库A 的数据镜像到从数据库B,是单向的,Zen Cart网店的数据读写都必须在数据库A进行,结果会自动镜像到数据库B中.但是对数据库B的直接操作,不会影响数据库A ...

  7. Asp.net MVC Razor模板引擎技巧分享

    Razor是Asp.net MVC中新的默认模板类型, 语法简单易用.这篇文章不涉及Razor的语法,主要介绍Razor的一些在MVC项目中的使用技巧,以及脱离MVC环境下,如何使用Razor. 阅读 ...

  8. android 设置布局为无标题样式

    <!-- Application theme. --> <style name="AppTheme" parent="android:Theme.Lig ...

  9. spring为什么不能注入static变量

    Spring 依赖注入 是依赖 set方法 set方法是 是普通的对象方法 static变量是类的属性 @Autowired private static JdbcTemplate jdbcTempl ...

  10. python 缩进语法,优缺点

    Python的语法比较简单——采用缩进方式 缩进有利有弊: 好处之一是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab.按照约定俗成的管理,应该始终坚持使用4个空格的缩进. 其二是强迫你写出 ...