SQL优化:化解表关联的多对多join
关系数据库的基本概念就是关系,对应到数据库软件中就是join,具体有:(1对1,1对多,多对多)。
在写sql时,经常会进行join,但是如果在join时没注意,关联条件是多对多,那么数据量就会成几何级数的增长,接下来又进行了group by,去除重复,真是吃力不讨好,曾经写过一个sql,运行需要7分钟,在修改之后,只需要10秒。。。
昨天写了一个存储过程,写好后发现非常慢,但是当前系统里的数据量就几十万条,数据量是比较小的。
代码如下:
declare @biz_date varchar(7)set @biz_date = '2016-10'select '达成率' kpi,4 as sort,v.emp_id,count(distinct v.store_id)*1.0/nullif(count(distinct m.store_id),0) v
FROM TB_CALL_PLAN v with(nolock)
inner join TB_STORE m with(nolock)on m.org_id = v.org_id and m.state = '1'
WHERE v.business_date LIKE @BIZ_DATE+'%'
group by V.EMP_ID
这段代码运行时间是1分17秒,要计算某个人员的 达成率,逻辑也是很简单,其中的2个表是多对多的关系。
仔细想想慢可能是由于这种多对多的关系,一下子把数据集放大了好多倍,最后又通过group by 来去重 count(distinct store_id),所以就慢了。
于是修改了代码:
declare @biz_date varchar(7)set @biz_date = '2016-10'select '达成率' kpi,4 as sort,v.emp_id,count(distinct v.store_id)*1.0/nullif(c,0) v
FROM TB_CALL_PLAN v with(nolock)
inner join
(select m.org_id,count(*) as cfrom TB_STORE m with(nolock)where m.state = '1'group by m.org_id
)mon m.org_id = v.org_id
WHERE v.business_date LIKE @BIZ_DATE+'%'
group by V.EMP_ID,c
这段代码从表面看,好像是比最初的代码要复杂了,现在内部聚合tb_store的数据,然后再和外面的v表关联,但一个好处是对应关系变成了多对一的关系,也就是m的一个org_id对应多个v中的org_id,先把一个表的数据量通过group by缩小,然后再关联,这样关联数据就不会太多。
这么修改代码,运行时间降为0秒,实则是化繁为简。
转载于:https://www.cnblogs.com/momogua/p/8304385.html
SQL优化:化解表关联的多对多join相关推荐
- SQL语句多表关联查询语法
**sql语句多表关联查询语法** 一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join scor ...
- 通过图表简化sql语句的表关联
在之前的博文中分享过一个执行了两天的一条sql语句,走了两个大表的扫描,导致执行时间很长,通过简化sql做了不小的改进,今天我们来看看还可以做些什么. 上次简化后的语句如下: with tmp_log ...
- mysql 优化表_mysql里sql优化和表结构优化
开启慢查询日志 计入sql show variables like 'slow_query_log';//慢查询查看状态 OFF未开启 ON开启 show variables like '%log%' ...
- sql 忽略大小写_Flink使用Calcite解析Sql做维表关联(一)
点击箭头处"蓝色字",关注我们哦!! 维表关联是离线计算或者实时计算里面常见的一种处理逻辑,常常用于字段补齐.规则过滤等,一般情况下维表数据放在MySql等数据库里面,对于离线计算 ...
- 20,sql 测试 : 1.4g 文件的 sql 运行测试,表关联,日期转换,字符编码,乱码解决,程序的 shell 执行,字符串转数字,三个隐式转换,用列分区,输出,sum over
一 ,基础操作 : 1 ,表关联 : select stock.area,goods.smallLei,goods.typeColorId,weekofyear(to_date(stock.sellD ...
- mysql索引优化 - 多表关联查询优化
1 left join EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card; LEFT JOIN条件用于确定如何从 ...
- 【数据库】sql实现两表关联更新
postgresql 实现两表关联更新 UPDATE (要更新的表) table1 t1 SET t1.字段1 = t2.字段1, t1.字段2 = t2.字段2, FROM(数据来源表) table ...
- SQL语言多表关联查询
新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) ...
- sql两张表关联按表日期取最近
需求:按照两个表的日期找到相对应b表的结束时间减去b表的开始时间查询相关相减的值, 在关联a表最接近b开始的时间进行关联 id time group xxx 1 2022 ...
最新文章
- 从0移植uboot (二) _uboot启动流程分析
- Mysql练习_mysql练习题
- c 批量导入mysql数据库_C#.NET中如何批量插入大量数据到数据库中
- 安装XCode7.1后,QT5.5出现的各种问题解决方案
- Django ==》 内置信号
- php_mysql操作
- excel能创建html吗,如何通过Excel电子表格使用循环创建单独的HTML发布页面
- pmp项目变更的流程图_PMP流程图
- 每天进步一点点 2016-10-28
- mayan 游戏真是毒瘤
- LINUX无法定位软件包
- grep -A -B -C -a -c -n -v -i等
- 【记录】codeReview总结
- Linux基础:su命令使用方法介绍
- fgetc getc函数
- 拼音检索VS五笔检索---Javascript实现
- 邮箱服务RBL黑名单申诉
- IO系统性能之二:缓存和RAID如何提高磁盘IO性能
- 如何玩转信用卡 银行不会告诉你的十个秘密
- F607Za光猫设置拨号及相关技术
热门文章
- python杨辉三角编程_Python基础练习实例49(打印杨辉三角)
- python判断是相邻数字,检查Python中相邻数字的绝对差之和是否为素数
- springboot集成钉钉_Java(SpringBoot)实现钉钉机器人消息推送
- python基础试题选择题_附带答案的15道经典python基础面试题
- django1.11 mysql配置_Mysql没有使用python3.6与Django 1.11.7连接
- matlab矩阵代数计算,MATLAB学习笔记(五):符号计算(符号矩阵+代数方程组求解)...
- php 迭代和递归,实战PHP数据结构基础之递归
- 平安京服务器维护无法发布新内容,决战平安京无法登陆怎么解决 无法登陆原因及解决方案一览_3DM手游...
- aws linux使用ssh登陆_【Linux】 使用ssh连接远程服务器
- python list remove_python list有关remove的问题