leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?

        之前谈了怎样后台导出SAP序时账,因为导出的序时账数据量较大(3家主体公司,2017-2020年的数据),用了数据库MYSQL中的LEFT JOIN 来处理连接多表汇总数据,查询太慢啦,后来沦落到用手工分年来汇总数据,然后再导到MYSQL进行数据查询分析,惨兮兮,宝宝真的很生气,今天我就在项目结束后来搞一搞原因,为什么会这么慢?

01

背景

        首先说下项目背景,从SAP后台导出了与会计凭证相关的两张表,两张表分别是BSEG(分字段导了两次)和BKPF,明细字段结构如下所示:

a7806a99dcb5bdc5e281744051e5535a.pnga594e8307145eff358abe8e989199739.pngce11ea6d1cf3afb65780f5c349f498fb.png

        我现在的目标是把三张表数据拼成一张表数据,即一条完整的凭证,最终应当实现的结果为:

0244a85592ef0c6e2dfb5f495f33d463.png

02

解决思路

我理了下处理这三张表数据的思路:

1、将BSEG1和BSEG2这两张表数据以公司、年度、凭证编号、项这4个字段为索引连接起来,得到一个完整的BSEG表;

2、将BSEG表和BKPF表这两张表数据以公司、年度、凭证编号这3个字段为索引连接起来,得到一个完整的凭证表。

步骤1:下面我来进行上述问题解决思路的第一个步骤,用到了以下语句,我用10条以内的数据试了一下,花了0.003秒,这个语句完美的实现了我的需求,而且在ON后面对4个条件加上括号实现的结果也完全一样,如下所示:

SELECT * FROM bseg2 t  LEFT JOIN  bseg1 s

ON (s.公司=t.公司1

and s.凭证号码=t.凭证号码1

and s.年度=t.年度1

and s.项=t.项1)

bd5fe313b992fdf5817ea87593bfd72d.png

         可是我的BSEG表1和BSEG表2 分别包含了104,2033条104,4095条数据,百万行数据4个条件同时LEFT JOIN,项目进行的时候我试过了,一下午没跑出来,要是我去客户公司对面的那座山去溜几圈,可能都已经回来了……

         好了,我改变方法了,把4个条件字段连接起来单独插入一列,分别构成两张表的主键(意思是该列元素均为唯一且不为空),用到了CONCAT语句,可以把多个字段的信息连接起来。例如:SELECT CONCAT('M','y','S','Q','L')——该语句的执行结果为MYSQL ;那么现在我的问题就转化成了,以ORDER_NO字段连接BSEG1和BSEG2数据,由原来的4个连接条件变成了1个连接条件。

8714ce86994758cb6e6c6f0cf0b7d6c9.png

        好的,在连接两表数据前还有关键的一步,添加索引,添加索引的效果是可以加快查询速度,添加主键索引我用到了以下语句,意思是为表BSEG1的ORDER_NO 字段添加索引,添加索引真的得用语句来加索引,数据量大千万不能用设计表的那个傻瓜式图形界面来添加,我试过,设计表图形界面添加索引,会让你的MYSQL停留在那个界面,完全卡死。语句添加索引我忘了截图完成时间,几十秒。

ALTER TABLE  bseg1 PRIMARY KEY (order_no)

      见证奇迹的时刻到了,把LEFT JOIN写上去,以ORDER_NO连接两表数据。26.541s,哼,亮瞎了我的眼,又高兴又生气。

d10640cfebe2c7554a97761a80526a91.png

步骤2:我没有在MYSQL中操作把步骤一中得到的BSEG表和BKPF连接了,大致思路就是现在BKPF和BSEG连接有三个条件字段(公司、凭证编号、年度),解决方法参见步骤1.

03

写在最后

        现在我开始吐槽了,我真的高兴,又有点生气,甚至说是不甘心。我手工汇了老半天,MYSQL你26s就给我跑出来了,想想就不甘心。然后我又试着说服自己,以后遇到这种问题,应该心里就有底了,唉,还是不甘心呐

85be82fa72bc0460444977bccfc32e4c.png

去抖音看我跳舞喔!

公众号 : MOMO的笔记

抖音号:348785339

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 画布包括不了全部组件?_试验程序:画布版九键琴

近期有读者询问如何制作出滑动琴键连续发出声音的程序,他尝试用一排按钮充当琴键,但每次滑动只能触发一个按钮的点击事件,因此也只能发出一个声音。我提示他用画布替代按钮,他希望给予更具体的提示,于是我索性自己做了…

c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象

一.static1.它是一种修饰符2.使用位置:它用来修饰成员变量和成员方法static修饰成员变量,叫类变量;static修饰成员方法,叫类方法;类成员类变量类方法没有使用static修饰成员变量,叫实例变量;没有…

keil中断函数的写法_在 KeilC里,中断子程序与函数有何不同?( )_学小易找答案

【单选题】8051单片机共有( )个中断优先级【单选题】对定时器 0 进行关中断操作,需要复位中断允许控制寄存器的: ( )【多选题】真理向谬误转化的原因,主要在于( )【多选题】“批判的武器当然不能代替武器的批判,物质的力量只能用物质的力量来摧毁,理论一经群众掌握,也会变成物质…

c++ stack 遍历_C/C++内存分配!

一、预备知识—程序的内存分配一个由c/C编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)…

python读取oracle数据到hvie parquet_关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中...

说明:spark版本:2.2.0hive版本:1.2.1需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spark-sql程序实现将该文件读取并以parquet的格式通过外部表的形式…

el-date-picker设置默认日期_程序员必备:Java 日期处理的十个坑

前言整理了Java日期处理的十个坑,希望对大家有帮助。一、用Calendar设置时间的坑反例:Calendar c Calendar.getInstance();c.set(Calendar.HOUR, 10);System.out.println(c.getTime());运行结果:Thu Mar 26 22:28:05 GMT08:00 2020解析&…

scope python_Python标准库Scope

作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢!1 模块简介你一定在很多计算机科学课程上听说过作用域。它很重要,如果你不理解它的工作原理,那么就会出现一些令人…

java命令_JAVA与模式之命令模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述命令(Command)模式的:命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化&#xf…

android 16进制 全透明_你有几种实现方案Android 设备唯一标识?

前言项目开发中,多少会遇到这种需求:获得设备唯一标识DeviceId,用于:1.标识一个唯一的设备,做数据精准下发或者数据统计分析;2.账号与设备绑定;3.....分析这类文章,网上有许多资料&a…

链表的数据域怎么使用结构体_一步一步教你从零开始写C语言链表

为什么要学习链表?链表主要有以下几大特性:1、解决数组无法存储多种数据类型的问题。2、解决数组中,元素个数无法改变的限制(C99的变长数组,C也有变长数组可以实现)。3、数组移动元素的过程中,要对元素进行大范围的移动…

python计算bmi_Python编程语言:如何用Python编程来判断体重指数BMI是否健康

上一篇小编分享了自己学习Python语言有关字符串和模块time使用的相关知识,这一篇小编分享给大家的是比较有趣的运用,那就是如何用Python编程来表示自己体重BMI。 用Python程序来算出我们自己的BMI指数,来判断我们自己的健康情况,首…

drbd实现mysql地热备_heartheartbeat+drbd+mysql主库热备

1 环境主机名网卡磁盘mastereth0 桥接模式 eth0(192.168.1.10) 自定义模式(VMnet2)(192.168.2.10)VIP 192.168.1.200/210系统盘20G外接磁盘slaveeth0 桥接模式(192.168.1.20) eth1 自定义模式(VMnet2)(192.168.2.20)VIP 192.168.1.200/210系统盘20G外接磁盘server3eth0 桥接模式…

dba的前景_运维、测试、程序员,这些技术岗位哪个更有前景?

在一个初具规模的互联网公司,从业务方面出发,有很多岗位类型,比如运营、客服、市场、产品、设计、技术等等。在这些大类下面,还要细分各种小类,以技术为例,可分为前端(客户端)、后端、测试、运维、DBA等等&…

mysql深度解析_百万级数据下的mysql深度解析

mysql 作为一款非常优秀的免费数据库被广泛的使用,平时我们开发的项目数据过百万的时候不多。最近花了大量的时间来深入的研究mysql百万级数据情况下的优化。 遇到了很多问题并解决了他们,特此分享给大家。欢迎提出您的宝贵意见!一、百万级数…

python异步实现方式_Python通过yield实现异步

改写程序first函数等待long函数返回值的方式为yield,代码如下: import _thread import time gen None def long(): print (long execute) def fun(): time.sleep(5) result long end gen.send(result) _thread.start_new_thread(fun,()) def first(): print (firs…

免安装版的mysql步骤_mysql免安装版的安装方法及步骤

mysql免安装版的安装方法及步骤发布时间:2020-07-15 14:07:18来源:亿速云阅读:83作者:清晨小编给大家分享一下mysql免安装版的安装方法及步骤,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧&am…

jupyter notebook怎么写python代码_如何在Jupyter Notebook中使用Python虚拟环境?

如何在使用Jupyter Notebook时,解决Python虚拟环境间的切换问题?本文一步步帮你拆解。希望你能够避免踩坑的痛苦,把更多的时间花在愉快的编程上。 痛点 Python目前有两个主版本并存,这很让人苦恼。 一般人对于软件,总是…

cmd检查java_如何通过cmd查看java环境

展开全部JAVA环境变量设置一、下载JDK。62616964757a686964616fe4b893e5b19e31333363376561下载后是一个可执行程序,双击安装,安装路径为C:\Program Files\Java\jdk1.6.0_22\(当然,其他路径也可以),如下图:二、设置环境…

ios 检测是否联网_秋招|阿里 iOS 五轮面经分享,已收到阿里的意向书

作者:aaaaaazzzz链接:https://www.nowcoder.com/discuss/302113来源:牛客网感觉牛客很少看到iOS的面经了,今天收到了阿里的意向书,来分享下面经,希望大家都Offer~!总体感觉面试官都非常好&#…

java spring框架 注解_spring框架之注解的使用

原标题:spring框架之注解的使用今天是刘小爱自学Java的第122天。感谢你的观看,谢谢你。学习内容安排如下:Spring注解的使用。JavaWeb项目的搭建。Spring的Web集成。本来还计划学Spring的junit测试集成的,结果又没时间了。一、Spri…