SQL Server 2014里的针对基数估计的新设计(New Design for Cardinality Estimation)
对于SQL Server数据库来说,性能一直是一个绕不开的话题。而当我们去分析和研究性能问题时,执行计划又是一个我们一直关注的重点之一。
我们知道,在进行编译时,SQL Server会根据当前的数据库里的统计信息,在一定的时间内,结合本机资源,挑选一个当前最佳的执行计划去执行该语句。
那么数据库分析引擎如何使用这些统计信息的呢?数据库引擎会根据数据库里的统计信息,去计算每次操作大约返回多少行。这个动作称之为基数计算(cardinality estimation)。数据库分析引擎会基于这些信息判断选择逻辑或物理的操作符,操作成本等等,生成一系列执行计划并最终挑选一个合适的执行计划。
在SQL Server 2014中,基数计算与之前的版本相比出现了较大的变化,并且这些变化对执行计划的生成有客观的促进作用。新的基数计算相对于之前的版本而言并不是增加了一个新的补丁,修复了一些bug,可以说是一次重写,甚至基于的数学计算模型也发生了变化。
新的基数计算主要适用于DW(数据仓库)的场景,会给DW系统带来较大的性能提升。
就效果而言,由于采用的数学模型的一些变化,新的基数计算在对返回行数预估上,较以往往往会更加准确。
以下两个例子是对新旧基数计算的对比。
1. 独立性假设
测试语句如下:
Select *
From Cars
Where Make=‘Honda’ AND Model =‘Civic’
在测试数据库中运行上述语句,其中表的行数是1000行,Make=’Honda’ 有200行,Model=’Civic’ 有50行。
在之前般的CE中,会认为这两个筛选条件之前没关系,所以预测返回行数是0.05 * 0.2 * 1000 = 10, 而在新的版本CE中,会认为这两者之间应该是有关系的,因此会采用指数退避算法,预测返回值是0.05 * sqrt(0.2) * 1000 = 22.36。
实际返回行数50行。
因此新的CE会更加的保守,在这种情况下会更加准确。
2. 连接(join)的变化
当出现等值连接时,会采用下面的计算方法:
- 选取两个输入中distinct值较少的一个
- 上面步骤取得的值乘以两边的平均频率、
例如

新的基数计算涉及的修改较多,例如还有针对ascending key场景所做的修改,使用统计信息方法的修改等等。但是对传统的一些内容仍然保持原样,例如表变量预估为一行,存储过程中的本地变量会认为是未知值,parameter sniffing 问题仍然可能发生等等。
但是总整体而言,新的基数计算给DW场景的工作负载会带来客观的性能提升,包括编译时间和执行时间两方面。
前述中我们提到了统计信息,在SQL Server 2014中,会有一个新的统计信息概念,增量统计信息(Incremental Statistics)。
一般说来,统计信息记录的是列或者索引中的数据分布,数据密度等等。当用户打开自动统计信息更新后,假如数据发生了大约20%的变化,那么会触发统计信息自动更新。
在旧的版本数据库中,关于统计信息会遇有以下两个不足之处:1. 对于非常大的表,20%的自动统计信息阈值太大。2. 重建统计信息需要重新扫描或者重新取样扫描整个表,假如能做到只扫描新的数据,那么更佳。
以此为目标,SQL Server 2014 出现了一个新的功能增量统计信息(Incremental Statistics)。
Incremental Statistics有以下特点:
- 它适用于分区表,并且主要的数据更新发生在新的分区
- 每个分区都有自己的统计信息对象,全局会将这些统计更新合并
- 由于多数数据改变发生的新的分区,因此更新统计信息时,我们只需要更新新区的统计更新,系统会将其在与其他的分区的统计信息更新。这样会避免去重建其他分区的统计信息。
- 分析引擎使用全局统计信息而不是每个分区的统计信息。
- 当自动统计信息打开后,对每个分区而言,触发的阈值为该分区20%的数据更新。对全局而言是平均分区大小的20%。
SQL Server 2014里的针对基数估计的新设计(New Design for Cardinality Estimation)的更多相关文章
- SQL Server 2014里的性能提升
在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...
- SQL Server 2014里的缓存池扩展
在今天的文章里我想谈下SQL Server 2014里引入的缓存池扩展(Buffer Pool Extensions).我们都知道,在SQL Server里,缓存池是主要的内存消耗者.当你从你存储里读 ...
- 在SQL Server 2014里,如何用资源调控器压制你的存储?
在今天的文章里,我想谈下SQL Server 2014里非常酷的提升:现在你终于可以根据需要的IOPS来压制查询!资源调控器(Resource Governor)自SQL Server 2008起引入 ...
- SQL Server 2014里的IO资源调控器
在本文中,我们将来看看SQL Server 2014在资源调控器方面增加了哪些新的功能.资源调控器(Resource Governor)是从SQL Server 2008开始出现的一项功能.它是用于管 ...
- 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...
- 第16/24周 SQL Server 2014中的基数计算
大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- SQL Server 2014如何提升非在线的在线操作
在今天的文章里,我想谈下在线索引重建操作( Online Index Rebuild operations),它们在SQL Server 2014里有怎样的提升.我们都知道,自SQL Server 2 ...
- SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer
Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛. 此文是在微软商业智能官方博客里 ...
随机推荐
- oracle在impdp时报ORA-31655和ORA-39154
检查表空间大小设置的是否合理. 另外可以试试 grant IMP_FULL_DATABASE to user;增加导入权限. (转)
- Android 客户端设计之解决方案
解决方案,是正对与需求来谈的.一个抽象的需求,需要一个较为上层抽象的解决方案来处理,这是病和药的关系.但是一个解决方案,可能会包含多个功能,每个功能都是解决方案上的一个节点.一个优秀的解决方案必然需要 ...
- Javascript-URL帮助类
很久以前写的一个js关于url的帮助类,今天又翻出来了.贴一下源码,做一个简单的教程. 作用 这是一个关于urlquery的一个帮助类,我们在前端编程的时候经常涉及到操作并重组url的情况,在参数比较 ...
- javascript 设计模式-----享元模式
四个轮子,一个方向盘,有刹车,油门,车窗,这些词首先让人联想到的就是一辆汽车.的确,这些都是是一辆车的最基本特征,或者是属性,我们把词语抽象出来,而听到这些词语的人把他们想象陈一辆汽车.在代码里面也是 ...
- MySQL4:存储过程和函数
什么是存储过程 简单说,存储过程就是一条或多条SQL语句的集合,可视为批文件,但是起作用不仅限于批处理.本文主要讲解如何创建存储过程和存储函数以及变量的使用,如何调用.查看.修改.删除存储过程和存储函 ...
- java提高篇(十八)-----数组之一:认识JAVA数组
噢,它明白了,河水既没有牛伯伯说的那么浅,也没有小松鼠说的那么深,只有自己亲自试过才知道!道听途说永远只能看到表明现象,只有亲自试过了,才知道它的深浅!!!!! 一.什么是数组 ...
- Hibernate中对象的三个状态解析
Hibernate 将操作的对象分为三种状态: 1. 瞬时 (Transient )/临时状态/自由状态 持久 (Persistent) 脱管 (Detached) 瞬时对象特征: 第一.不处于 Se ...
- js中setTimeout()的使用bug
今天用setTimeout()时,遇到一个奇怪的现象,通过多方面的查询,最终解决了问题,这是setTimeout()设计的时候存在的一点点bug. 代码的作用主要是在三秒后自动关闭本浏览器窗口: 代码 ...
- 爱上MVC3~为下拉列表框添加一个自定义验证规则
回到目录 开发它的原因: 之前的同事,也是我的哥们,问我下拉列表框是否可以支持验证,这个问题看似简单,但确实MVC里有为我们提供,所以,只能自己写个扩展了,即自己写一个attribute特性,让它继承 ...
- 为什么MVC不是一种设计模式
http://damoqiongqiu.iteye.com/blog/1949256 ---比较Backbone和Ext4.x在MVC实现上的差异 大漠穷秋 前言 圣人云:不想做妈咪的小姐不是好码农. ...