第16/24周 SQL Server 2014中的基数计算
大家好,欢迎回到性能调优培训。上个星期我们讨论在SQL Server里基数计算过程里的一些问题。今天我们继续详细谈下,SQL Server 2014里引入的新基数计算。
新基数计算
SQL Server 2014里一个增强是新的基数计算。上个星期你已经学到老基数计算有些限制,会生成错误的估计,这会导致不好的执行计划表现。截至SQL Server 2012,你一直在使用自SQL Server 7.0引入的基数计算。
当然,几年来也有很多问题被修正,但默认它们都没启用的——你需要启用SQL Server里指定的跟踪标志才可以使这些修正生效。用那个方法微软确保它们不会引入所谓的计划质量退化(Plan-Quality Regressions)。因此新的基数计算在SQL Server里是自SQL Server 7.0以来在那个领域的第一个重大改变。
新基数计算的目的是提高你执行计划的质量。但是当然,还是有情况你会看到计划的退化。因此对于你的工作负荷和指定查询,你要仔细评估下新基数计算是否可用。因此SQL Server 2014再次引入不同的跟踪标志,使用它们你可以影响查询优化器如何工作。
为了使用新基数计算,你的数据库必须设置数据库兼容级别(Database Compatibility Level)为120。当你从先前SQL Server版本还原或附加数据库,你的兼容级别会改变——因此查询优化器就不会用到新的基数计算。使用下面的查询你可以很容易得出在你SQL Server实例里,每个数据库的兼容级别:
SELECT name, compatibility_level FROM sys.databases GO
如果在你面前有一个执行计划,你可以对SELECT运算符查看下它的属性窗口,看下CardinalityEstimationModelVersion属性值。70表示使用老的基数计算,120表示使用新的基数计算。

另外,SQL Server 2014提供下列2个新的跟踪标记:
- 2312
- 9481
使用2312跟踪标记你可以指出,你想使用SQL Server 2014新的基数计算(例如,当你想使用低于120的兼容级别)。如果你想回到老的基数计算,就可以使用9481跟踪标记。你可以在实例级别,会话级别,也可以通过QUERYTRACEON查询提示来设置这些跟踪标记。我们来看下面的例子,使用2312跟踪标记来强制使用新的基数计算。
SELECT * FROM Person.Person
OPTION (QUERYTRACEON 2312)
GO
新基数计算提供很多改变,可以带来更好的估计,更有可能带来更好的执行计划。微软已经对基数计算的下列领域进行了重写:
- 对于多列谓语的估计
- 如何处理自增键列问题
- 对JOIN谓语的估计
- 通过扩展事件的故障排除
如果你想了解这些改变的更多细节,我强烈推荐读下Joe Sack写的白皮书用SQL Server 2014基数计算优化你的查询计划(Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator)。 也可以阅读下SQL Server 2014里的针对基数估计的新设计(New Design for Cardinality Estimation)。
小结
在这1期的性能调优培训我给你概括介绍了SQL Server 2014引入的新基数计算。
这个月我们已经对SQL Server里的统计信息进行了非常深入的学习!在过去的4个星期里,我们看到它们对获得好性能的执行计划确实非常重要。从下个星期开始,第5个月的性能调优培训开始了,你会学习到SQL Server里的锁,阻塞和死锁(Locking, Blocking, and Deadlocking)。请继续关注!
围观PPT:
0907_16_SQL_Server_2014中的基数计算.rar
第16/24周 SQL Server 2014中的基数计算的更多相关文章
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
- SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变
前提 本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段 ...
- SQL Server 2014 中新建登录及权限分配【界面版】
本篇经验将和大家介绍分配SQL Server 2014 中,新建登录用户,分配权限,并指定该用户的数据库的方法,希望对大家的工作和学习有所帮助! 方法/步骤 1 打开 MS SQL Server Ma ...
- 小心SQL SERVER 2014新特性——基数评估引起一些性能问题
在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...
- SQL Server 2014新特性——基数评估(白皮书阅读笔记)
基数评估 目录 基数评估 说明 基数评估准确的重要性 模型假设 启用新的基数评估 验证基数评估的版本 在迁移到新的基数评估前要测试 校验基数评估 偏差问题 需要手动处理的变化 避免因为新的CE造成性能 ...
- SQL Server 2014 中,新建登录用户,分配权限,并指定该用户的数据
一.运行环境 系统:Windows 10数据库:SQL Server 2014数据库名: APP 新建的用户名: app 二.操作步骤 1.打开 MS SQL Server Managemen ...
- 第1/24周 SQL Server 如何执行一个查询
大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要, ...
- 启用SQL Server 2014 中的OLE 自动化功能
企业中很多架构都在快走向Service概念,尽量采用平台服务方式提供给各个Application使用.因此,个系统都会去呼叫像是Web Service,WCF或ODATA…等等各种类型的服务.一般来说 ...
- (4.24)sql server变量中set与select的区别
SET vs SELECT是SQL极客之间讨论的常见话题,也是最受欢迎的面试问题之一.SET用于为变量赋值,SELECT用于赋值或从变量/ table / view等中选择值. 让我们看看在不同场景中 ...
随机推荐
- guzzle调用失败-缺少guzzle
用composer安装了,但是目前为止还有问题.开发环境是 WAMP PHP5.4.12. 已经打开PHP.ini 的SSL扩展,现在还是提示缺少 curl-ca-bundle.cr 报错 No sy ...
- Xamarin.Android之MvvmCross
欢迎大家加入以下开源社区 Xamarin-Cn:https://github.com/Xamarin-Cn Mvvmcross-Cn:https://github.com/Mvvmcross-Cn ...
- Jexus V5.8.2 正式发布,强劲的高性能 web 服务器
Jexus 是一款运行于 Linux 平台,以支持 ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布. 有如下更新: 1,新增 ...
- 循序渐进做项目系列(1):最简单的C/S程序——让服务器来做加法
(本文是专门针对未接触过C/S开发的初学者而写的,C/S开发高手请自动忽略啊~~) 还在写“Hello world!”式的单机程序吗?还在各种拖控件吗?是否自己都觉得有点low呢?来个质的飞跃吧!看看 ...
- 算法:Astar寻路算法改进
早前写了一篇<RCP:gef智能寻路算法(A star)> 出现了一点问题. 在AStar算法中,默认寻路起点和终点都是N x N的方格,但如果用在路由上,就会出现问题. 如果,需要连线的 ...
- 【转】EntityFramework(EF)贪婪加载和延迟加载的选择和使用
原谅:http://www.weixq.cn/Article/Detail/906 贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 using (var context = new MyDbCo ...
- 基于正则的INI读写工具类,支持加密解密
看到这个标题,有人会问,现在都用xml做配置文件了,谁还用INI文件啊!下面来简单对比一下xml和ini: 1.XML功能强大表达能力强,同时扩展性好. 2.它的主要优势是异构平台的整合.通讯. 3. ...
- 【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
这篇文章解决了在StackOverflow上一个经常被提到的问题. 在配置发生变化(Configuration changs)时,什么是最好的保存活动对象方法,比如运行中的线程,Sockets,Asy ...
- iOS——Core Animation 知识摘抄(三)
原文地址:http://www.cocoachina.com/ios/20150105/10827.html CAShapeLayer CAShapeLayer是一个通过矢量图形而不是bitmap来绘 ...
- CSS3动画:YouTube的红色激光进度条
本文只是讨论和实现了动画效果,并未将动画与页面实际下载关联,有朋友们问如何应用,可以使用现成的一些插件比如这个,这个,还有这个. 之前一篇文章<CSS3 动画一瞥>简单介绍了CSS3动画相 ...