L 又回来了...

走在 8 月的夜魔都街头,霓虹依然那么撩人,黄浦江畔依然清晰可听的传来酒杯欢快的交割。这一切再次在 L 身旁流过,却早已是云烟。

公司的世界500强ITIL项目已经瓜熟蒂落,该拿到的工程款一分不落,要不怎么能是500强呢,一个报表开价都超3万。这段时间,在 L 手里流过了至少陆家嘴一栋房。那是什么概念,L 唏嘘,“做得再好,也只是为资本家数钱,他们餐桌上宁可多添几瓶82年的拉斐,也不会念着你有个娃儿,给你多涨一点工资。连超过9点的打车报销都取消了。该换个地儿了”

L 一口长气,走出滨江森林软件园区,换上了张江方向的2号线。他的下一站便是浦东软件园。地大,人稀,活儿少,离家近。L 觉得这才是自己想要的工作。重新做上开发类岗位,做点自己开心的事,不用担心10多张嘴等着他来喂,心静了许多。

“L 听说你以前做过很多 SQL 调优,帮我看个报表呗。30多秒,优化提高不多” 新办公室的小 C 是个话不多的南方姑娘,每次有问题都是很直接,没有任何前戏。L 倒也很喜欢这样的对话方式,直来直去效率最高。

SELECT Prod.Class, Sum(Fct.SalesAmount) AS Amount
FROM FactInternetSales Fct
inner join   DimProduct Prod
on Prod.ProductKey = Fct.ProductKey
WHERE Prod.Class IS NOT NULL AND Prod.ListPrice between 20 and 200
GROUP BY Prod.Class 

其实这样的代码,优化本来很简单,一个索引,一个SQL条件下推就可以搞定了。但偏偏生产上没有找到索引,而加索引这类 DDL 操作基本不可能在平时动手做。

“执行计划看得出哪里有问题吗?”

“一切都很正常啊”

“你看,执行计划的上下两个访问表的方式,有啥子问题没”

“访问了聚集索引”

“访问方式是什么”

“都是聚集索引扫描方式”

“问题就在这里”

“不懂”

“扫描引起很多无关数据页的访问,浪费很多时间。就像查字典,你会选择一页一页去翻你想要查的字,还是直接翻到对应拼音的那几页?”

“你的意思是,让表访问方式改变成搜索形式”

“确切的说,那是 seek 方式。”

“再看这里事实表的 scan, 查了6万多数据,相当于是做了全表扫表”

“那怎么让他变成 seek 查找呢?这 Join 两边都有索引,已经最优化了啊”

“Predicate Pushdown 不知道你听说过没,就是在 Join 之前,先把条件下推到基表中去,以减少 Join 时的基数。这需要配合 bitmap filter 来实现”

SELECT Prod.Class, Sum(Fct.SalesAmount) AS Amount
FROM DimProduct Prod
inner HASH join FactInternetSales Fct
on Prod.ProductKey = Fct.ProductKey
WHERE Prod.Class IS NOT NULL AND Prod.ListPrice between 20 and 200
GROUP BY Prod.Class
OPTION(QueryTraceOn 8649)

“这里的 Hash Join 与 QueryTraceOn 8649 好厉害”小C第一次看到这样的SQL写法,不禁拍手叫绝。

“我们把 Join 改造成了 Hash Join, 并且执行计划也打造成了并行执行模式,还引入了 bitmap 这货。还记得之前我提过的 bloom filter 嘛,就是 bitmap 的底层思想。Hash 会改变 Join 的顺序,所以放到第一个去了。而重点是 QueryTraceOn 8649 ,它使得所有的单线程执行变为多线程执行了。”

“你看,自从引入了 Bitmap, 条件筛选下推了,仔细看 Cluster Index Scan, 在Predicate这一栏,有 Probe(Bitmap1004,Productkey,N'['IN ROW']') 这个提示,原本需要查 6万多数据,现在总共需要读取6千多。问题解决”

“我要回去好好研究,今天学的东西有点多”

看着小C满载而归的身影,L也止不住的苦笑。“其实公司真不是仅仅让你来学东西的。主动创造价值才能够走的更远,当然小C还年轻,不会考虑那么多。年轻真好”

往期回顾:

百里挑一,等你来抽奖

我的第一个小程序 - SQL 开发者问答

SQL Join 不可不知的一点优化策略相关推荐

  1. sql加上唯一索引后批量插入_阿里大佬总结的52条SQL语句性能优化策略,建议收藏...

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 cnblogs.com/SimpleWu/p/9929043.html 推荐:h ...

  2. 52条SQL语句性能优化策略

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引. 2.应尽量避免在 WHERE 子句中对字 ...

  3. 软件系统性能优化策略--SQL优化

    非常感谢大家对<大白话系列之C#委托与事件讲解>的支持,这次我给大家带来的是<软件系统性能优化策略>的讲解,这个讲解分别围绕SQL优化.IIS优化.代码优化[BS架构].数据库 ...

  4. 【MySQL】47 条SQL语句性能优化策略

    本文会提到 47 条 SQL 语句性能优化策略. 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引. 2. 应尽量避免在 WHERE 子句中 ...

  5. 52条SQL语句性能优化策略,建议收藏

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Promise yourself to be so strong ...

  6. 52条 SQL 语句性能优化策略全面解析,你知道多少种?建议收藏!

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Don't always in the memories of t ...

  7. 性能优化分析及常见性能优化策略总结

    最近,大家似乎都对性能优化分析,这一方面比较感兴趣.一方面是比较感兴趣,另一方面就是遇见许多类似的状况,但是,却不知从何下手,根源在哪里?应当如何正确优化?首先,先跟大家讲解下常见的性能优化策略分类! ...

  8. 亿级PV,常见性能优化策略总结与真实案例

    作者:晓明 来自:美团技术团队 0 题记 美团网是国内最大的O2O服务平台,虽然经常面临高并发.大流量等问题,但在用户体验优化上美团APP仍被众多IT同行所推崇,他们在性能优化方面积累的宝贵经验尤其值 ...

  9. 腾讯基于 Flink SQL 的功能扩展与深度优化实践

    简介:本文由腾讯高级工程师杜立分享,主要介绍腾讯实时计算平台针对 Flink SQL 所做的优化. 整理:戴季国(Flink 社区志愿者) 校对:苗文婷(Flink 社区志愿者) 摘要:本文由腾讯高级 ...

最新文章

  1. mysql 二进制日志 解析c++_mysql二进制日志文件恢复数据库
  2. python登录面向对象_python基础之面向对象
  3. 假期充电!20世纪最优秀的物理学家费曼是如何生活、学习和思考的?
  4. stl set求交集 并集 差集
  5. 大咖茶话会 | 与原新浪微博副总裁零距离沟通
  6. python3随笔-协方差,标准差,方差
  7. Docker入门-搭建docker私有仓库
  8. 如何入门.NET Core ? 推荐这10个优秀的开源项目!
  9. 思科数据中心Nexus 3000
  10. 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程
  11. laravel 中request
  12. 这个温州人,是中国开店最多的炸鸡王者
  13. 工作日志(一)、jquery上传插件uploadify的使用
  14. [UWP开发]NavigationView基础使用方法
  15. [2018国家集训队][UOJ449] 喂鸽子 [dp+组合数学]
  16. java 日程日历_java编程:我要做一个提醒日程的软件,不是要用到日历和时钟么,这要不要自己编,还是可以直接同步电脑上...
  17. android游戏推广,安卓APP游戏首发市场渠道整理
  18. UG NX二次开发(C#)-装配-删除阵列矩阵
  19. 安全检查监理项目部材料清单
  20. 华硕飞行堡垒键盘背光灯无法显示怎么办?

热门文章

  1. 小米2s Android pie,抢先体验 Android Pie 小米 MIX 2s 已收到推送
  2. linux awk 处理字符串,awk 字符串与算数处理
  3. IDEA在terminal使用mvn命令
  4. H5历史API之pushstate
  5. java程序初始化的顺序
  6. Androis Studio中使用真机调试步骤
  7. 华硕主板开启虚拟技术
  8. jquery饼状图插件的指引线_绘制指引线的JS库leader-line
  9. mybatis返回值多个对象
  10. Flash小游戏---他们真的好