数据倾斜,技术黑话中最成功的的一个词。发明这个词儿的人,一定是天才,它在数据量和复杂度上,一箭双雕。

早期,我在看《Oracle Concepts》及各类 Oracle Performance Tunning 相关的技术书时,书中提到最多的术语是“数据分布”,比如用 statistics 统计每列的散值。这里的散值,又称单值,或“唯一值”,代表每列的基数 (Cardinality).

比如全世界就两种性别,男和女。无论男女数量多么不平衡,就性别来说,只有“男”,“女”两个单值,用数据库行话说,Cardinality 为 2.

那么知道每列的基数,有什么用呢,研究数据倾斜又有啥用?这种凡事先问有啥用的精致利己的心态,从求学时代,就与我纠缠不清。

所以,到底为什么要研究数据倾斜这个话题呢,我先放几张图,做个引子:

第一张图,为艾瑞咨询绘制的中国 IT服务行业,毕业生薪资流向的分布图。这张图的实际薪资曲线,符合正态分布

薪资区间,分别从左往右以 4.5%, 29%, 34.8%,25.6%,6.1% 的占比存在,可见大多数毕业生(29% + 34.8% + 25.6% =89.4%),初次入职时,薪资在 5K - 20K 之间。

假设,有 1000人参与了这次调查,那么你作为老板,要招个有 1 年经验,还能出活的劳动力,而且预算不能超过 5K,只要去 45 个人里面招,就能快速招到你要的人。

如果作为老板的你,愿意开出有竞争力的工资,比如 20K,你可以从 894 个人里面招,但如此巨大的规模,也增加了面试的时间成本。

考虑到社会的毒打,人的潜能被充分发挥,经过一定时间沉淀,社会人的薪酬,就不像应届生排列得那么符合正态分布了

以 20K 为分水岭,DBA 薪资往 20K 以上倾斜,这个范围的占比为 44.4%+ 21.2% = 65.6%.

同样以 1000人为调查基数,意味着以 50K 去招人,面试者可能会超过 656 人,面试时间成本太高。而 6K 去招人,则只需面试 30人,快则 2 天,人就到位。

此时,我们可以得到一个经验:数据发生倾斜是必然,极端的数据非常好找,但落到正态分布的中间位置,找起来就复杂了,所以得同时配备其他属性,才能更好定位到相关数据。

既然 20K-50K 的 DBA 人数那么多,怎样才能更快地招到人呢。有一个办法是,从低价格的地方挖人。

比如:

对比发现,贵阳地区以 8K 为平均数,那么直接以 20K 的价格,则可以很快招到人。

你看,加一维数据量就变小了。这就是处理数据倾斜的一个有效方法,以薪酬水平加地区,极大地减少样本数量,提高了筛选效率。

细看数据倾斜的解决方法,本质是判断怎么建索引更有效。最为关键的一步,是计算列组合的数据量占总数的比例,越低越有效。

那么,怎么计算列组合产生的基数高低呢,总不能每次全表扫描,做一遍排列组合计算吧?

接下来说两个常用的事前策略:

第一,是直觉。作为设计者,对业务数据的分布,一定会有意识。比如做零售,按照日期和门店做索引,肯定订单量分散更低;

第二,是做 Hash 索引。假设你在日期上装了索引,但查询里面,基本不按日期搜索,索引白建。于是,找两个或多个常用判断字段,做 Hash 索引。这样,就碎化了组合查询的密度,提高了效率

以上的策略,主要考量命中率。怎么分析命中率,这属于优化界的秘密武器,每个数据库厂商都有自己的数据字典,需要有好奇心的读者,慢慢摸索。原理都相通!

举个例子, SQL Server 中,有一种叫做 Statistics 的东西。它就是用来统计基数以及命中率的对象。

它通过统计每列或列组合的单值总数,计算在表总数据量上的占比。由此计算出这列的命中率,继而判断是否适合做索引。

使用以下命令即可查询每列或列组合的单值总数:

DBCC SHOW_STATISTICS('Sales.SalesOrderDetail', IX_SalesOrderDetail_ProductID)

这就是索引 IX_SalesOrderDetail_ProductID 的密度(Density). 密度越低,查询的命中率就越高,效率就越高

当然,用密度来预判命中率,也有一定的缺陷,需要注意很多地方,比如和柱状图的连用等等。详细的技术实战参考这篇文章:

【万字详解】SQL 优化引擎内幕

点击上方链接直达,为你详细解释 statistics 的查询,创建和效率优势,包括:

  • Statistics 分别有哪些查询方法

  • Statistics 分别有哪些创建方法

  • Statistics 在查询中的效率优势

好了,分享就到这里。最近魔都发生了些事,大家都知道了。作息,情绪都有些影响,所以更新频率有些慢,各位多担待。

--完--

往期精彩:

本号精华合集(三)

外企一道 SQL 面试题,刷掉 494 名候选人

我在面试数据库工程师候选人时,常问的一些题

零基础 SQL 数据库小白,从入门到精通的学习路线与书单

数据倾斜了怎么办?以应届生 20K Offer 为例相关推荐

  1. 应届生昆山offer和上海户口offer要如何选择?

    这两天还在苏州,没有感受苏州的什么好地方,天气有点微凉,有秋天的味道,同行的何总是一个很闷的人,我总想让他跟我说说故事,每次他都说「我是一个没有故事的男人」,是的,一个从毕业就开始从事测试工作10几年 ...

  2. 应届生拿到offer之后的流程_应届生签offer前需要参考的注意事项

    大学毕业生经过重重考验拿到 offer 之后, 下一步要面临的问题就是签约. 而如果有的同 学之前已经跟其它单位签约,现在又想和新单位签约,那么又涉及到一个问题:违约. 下面 给大家讲讲应届生签约最应 ...

  3. 就业数据|北上广深不再是首选,应届生奔向新一线

    来源:猎聘 本文约4900字,建议阅读10分钟 总体就业形势严峻,压力与机遇并存. 2023年高校毕业生预计达1158万人,创历史新高.大学生作为重点就业人群之一,历来备受社会各界关注. 时值大学生就 ...

  4. IT业称霸应届生薪酬榜,调查超27万毕业生后,有了这些发现

    薪资,一直是求职者在找工作时考虑的重点要素之一. 恰逢当下这个大型毕业.升学季,麦可思研究院近期发布了<2022年中国大学生就业报告>,揭露2021届大学生毕业半年后的就业情况.同时,也为 ...

  5. 蓬莱小课:零基础应届生如何转行学数据分析师?

    任何经验之谈,都是要亲身实践过,才能知道它的价值,希望以下文字,能对你们的职业道路有一丢丢用处. 关于转行 转行不转职,转职不转行.这句话是老生常谈了.现在互联网兴起,新职业层出不穷,碰到不感兴趣的岗 ...

  6. 应届生应聘大数据开发工程师,有没有机会?

    本科应届生想去应聘大数据开发工程师的岗位有没有机会? 我平时用的语言是Java和Python,看过<机器学习实战>(python)和<Hadoop权威指南>,确实很多地方一知半 ...

  7. 本科应届生应聘大数据开发工程师,有机会吗?

    本科应届生想去应聘大数据开发工程师的岗位有没有机会? 我平时用的语言是Java和Python,看过<机器学习实战>(python)和<Hadoop权威指南>,确实很多地方一知半 ...

  8. 今年嵌入式行业研究生应届生毕业大概薪资多少,大数据告诉你

    今年嵌入式行业研究生应届生毕业大概薪资多少,大数据告诉你 一个从本科开始学了四年嵌入式的老师傅,在这里唠嗑两句.目前年薪大约25左右吧. 先谈谈我的母校的毕业生情况吧. 我的母校是一个普通二本,许多本 ...

  9. 「历时6个月招聘数据收集」致应届生的一份招聘市场报告

    很多毕业生都对今年的岗位招聘感到担忧,那么从历史数据找找规律吧 一.前言 很多朋友都对今年对招聘市场感觉不乐观,还有一些想要进入互联网行业的朋友,有没有迷茫过?不知道学什么或者从何学起?哪些是市场上热 ...

最新文章

  1. 类脑量子叠加脉冲神经网络:从量子大脑假说到更好的人工智能
  2. getitemdata中参数设置
  3. boost::parameter::aux::maybe相关的测试程序
  4. SAP CRM business partner determination原理介绍
  5. 学习node.js的一些笔记
  6. Python技术知识清单(数据科学)
  7. python基础系列教程——Python3.x标准模块库目录
  8. 快手作者视频如何批量下载
  9. AutoCAD输出矢量图
  10. Jeff Dean执笔:一文看尽2018谷歌AI重大突破
  11. sqlserver transact-sql UPDATE tran 用事务处理更新语句
  12. 对比Ruby和Python的垃圾回收
  13. linux中 777,755等用户权限说明
  14. chrome去广告插件
  15. 天线远场定义_天线场区划分的定义
  16. 记笔记非常好用的一款工具 eDiary
  17. 免费下载国际学术论文SCI期刊文献软件,SCI-HUB EVA
  18. Android集成微信支付SDK,实现支付功能
  19. F-35 战斗机的代码量达到 800 万行,C语言竟然占到424万行,看来航电系统还得靠C(纯C)。
  20. 上班没事做gai这么办

热门文章

  1. qq空间html倒计时,用JavaScript做一个秒杀倒计时效果
  2. DSM -- 端口对应表
  3. xmpp即时通讯的笔记(摘抄)
  4. jquery实现点击复制文本
  5. JVM中的STW(Stop The World)
  6. java判断指定路径文件夹是否存在,若不存在则创建新的文件夹,存在则删除
  7. Java版智慧社区商业级别项目(附源码)
  8. 如何给mysql数据库的字段设默认值
  9. 通用链接-Universal Link
  10. 如何设计Service层