对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引。
对于大量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 的表查询,可以在关键的 连接节点字段上创建索引。的更多相关文章
- mybatis逆向工程,实现join多表查询,避免多表相同字段名的陷阱
mybatis逆向工程,实现join多表查询,避免多表相同字段名的陷阱 前言:使用 mybatis generator 生成表格对应的pojo.dao.mapper,以及对应的example的 ...
- Django ORM queryset object 解释(子查询和join连表查询的结果)
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) --- ...
- mysql中各种join连表查询总结
通常我们需要连接多个表查询数据,以获取想要的结果. 一.连接可以分为三类: (1) 内连接:join,inner join (2) 外连接:left join,left outer join,righ ...
- LEFT JOIN 多表查询的应用
表结构如下:只把主要字段列出 表一:付款记录表 Gather 字段:GatherID , AccountID, PayMents 金额, PayWay 付款方式 1 现金 2 刷卡 表2:销售记录 ...
- sql多表查询时怎么获取查到的字段
首先,多表查询不能用hql(貌似hql就是不支持多表查询,如果可以,希望看到的朋友给个例子) List list = systemService.findListbySql("SELECT ...
- mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】
1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tablename2: 注意这个操作必须保证两 ...
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tablename2: 注意这个操作必须保证两 ...
- oracle锁表查询,资源占用,连接会话,低效SQL等性能检查
查询oracle用户名,机器名,锁表对象 select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user ...
- 【mysql】mysql中单列索引、联合索引、Join联表查询建立索引 和 EXPLAIN的分析使用
2.创建联合索引,从坐到右分别为:userid.openId.name 2. #### -------------- 多表联合查询 update 2019/03/13 ------------ ...
随机推荐
- Iphone 英语语言下通讯录排序问题
Iphone 如果把界面语言设置成English,那么通讯录默认排序是通过拼音来排的,如果联系人信息中没有设置名字的拼音,那么这些联系人都会被放到#中. 批量添加拼音的解决方案: https://gi ...
- 希尔排序(Shell)
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...
- 学习 zookeeper
1.zookeeper是什么 zookeeper是hadoop的分布式协调服务.主要作用是对hadoop的集群节点进行监控.但是由于其功能的单一而去不依赖hadoop其他框架,所以不局限在hadoop ...
- redmine 安装
现在redmine安装部署的方法有很多,有安装包,docker,虚拟机镜像,还可以在ubuntu,centos中添加安装源. 但是最好维护方法还是从源码去部署. 一. 目标环境: 1. Redmine ...
- Java内存泄露简述
Java的一个最显著的优势是内存管理.你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收.然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现. 本篇 ...
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
曾今有件事情让我记忆犹新,那年刚来携程不久,马上就被安排写一个接口,供企鹅公司调用他们员工的差旅信息,然后我就三下五除二的给写好 了,上线之后,大概过了一个月...DBA那边报告数据库出现大量锁超时, ...
- IP地址(IPv4)/IPv6地址的正则表达式
原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/ Pv4地址正则表达式:^((25[0-5]|2[0-4]\d ...
- Python标准库(1) — itertools模块
简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数. itertools.chain(*iterable) ...
- Mysql数据库上修改日期-->造数据
这次要给客户安装测试ineedle设备,但是安装后不会立刻有数据显示,不能够全面的展示给用户web界面的一些信息.此时需要有一个公网服务器能够展示一下ineedle统计数据,但是公司58设备上没有流量 ...
- x01.os.12: 在 windows 中写 OS
在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可 ...