关系数据库的基本概念就是关系,对应到数据库软件中就是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相关推荐

  1. SQL语句多表关联查询语法

    **sql语句多表关联查询语法** 一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join scor ...

  2. 通过图表简化sql语句的表关联

    在之前的博文中分享过一个执行了两天的一条sql语句,走了两个大表的扫描,导致执行时间很长,通过简化sql做了不小的改进,今天我们来看看还可以做些什么. 上次简化后的语句如下: with tmp_log ...

  3. mysql 优化表_mysql里sql优化和表结构优化

    开启慢查询日志 计入sql show variables like 'slow_query_log';//慢查询查看状态 OFF未开启 ON开启 show variables like '%log%' ...

  4. sql 忽略大小写_Flink使用Calcite解析Sql做维表关联(一)

    点击箭头处"蓝色字",关注我们哦!! 维表关联是离线计算或者实时计算里面常见的一种处理逻辑,常常用于字段补齐.规则过滤等,一般情况下维表数据放在MySql等数据库里面,对于离线计算 ...

  5. 20,sql 测试 : 1.4g 文件的 sql 运行测试,表关联,日期转换,字符编码,乱码解决,程序的 shell 执行,字符串转数字,三个隐式转换,用列分区,输出,sum over

    一 ,基础操作 : 1 ,表关联 : select stock.area,goods.smallLei,goods.typeColorId,weekofyear(to_date(stock.sellD ...

  6. mysql索引优化 - 多表关联查询优化

    1 left join EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card; LEFT JOIN条件用于确定如何从 ...

  7. 【数据库】sql实现两表关联更新

    postgresql 实现两表关联更新 UPDATE (要更新的表) table1 t1 SET t1.字段1 = t2.字段1, t1.字段2 = t2.字段2, FROM(数据来源表) table ...

  8. SQL语言多表关联查询

    新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) ...

  9. sql两张表关联按表日期取最近

    需求:按照两个表的日期找到相对应b表的结束时间减去b表的开始时间查询相关相减的值, 在关联a表最接近b开始的时间进行关联 id time group                xxx 1 2022 ...

最新文章

  1. 从0移植uboot (二) _uboot启动流程分析
  2. Mysql练习_mysql练习题
  3. c 批量导入mysql数据库_C#.NET中如何批量插入大量数据到数据库中
  4. 安装XCode7.1后,QT5.5出现的各种问题解决方案
  5. Django ==》 内置信号
  6. php_mysql操作
  7. excel能创建html吗,如何通过Excel电子表格使用循环创建单独的HTML发布页面
  8. pmp项目变更的流程图_PMP流程图
  9. 每天进步一点点 2016-10-28
  10. mayan 游戏真是毒瘤
  11. LINUX无法定位软件包
  12. grep -A -B -C -a -c -n -v -i等
  13. 【记录】codeReview总结
  14. Linux基础:su命令使用方法介绍
  15. fgetc getc函数
  16. 拼音检索VS五笔检索---Javascript实现
  17. 邮箱服务RBL黑名单申诉
  18. IO系统性能之二:缓存和RAID如何提高磁盘IO性能
  19. 如何玩转信用卡 银行不会告诉你的十个秘密
  20. F607Za光猫设置拨号及相关技术

热门文章

  1. python杨辉三角编程_Python基础练习实例49(打印杨辉三角)
  2. python判断是相邻数字,检查Python中相邻数字的绝对差之和是否为素数
  3. springboot集成钉钉_Java(SpringBoot)实现钉钉机器人消息推送
  4. python基础试题选择题_附带答案的15道经典python基础面试题
  5. django1.11 mysql配置_Mysql没有使用python3.6与Django 1.11.7连接
  6. matlab矩阵代数计算,MATLAB学习笔记(五):符号计算(符号矩阵+代数方程组求解)...
  7. php 迭代和递归,实战PHP数据结构基础之递归
  8. 平安京服务器维护无法发布新内容,决战平安京无法登陆怎么解决 无法登陆原因及解决方案一览_3DM手游...
  9. aws linux使用ssh登陆_【Linux】 使用ssh连接远程服务器
  10. python list remove_python list有关remove的问题