大家好,欢迎回到性能调优培训。上个星期我们讨论在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中的基数计算的更多相关文章

  1. 第0/24周 SQL Server 性能调优培训引言

    大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...

  2. SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变

    前提  本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段 ...

  3. SQL Server 2014 中新建登录及权限分配【界面版】

    本篇经验将和大家介绍分配SQL Server 2014 中,新建登录用户,分配权限,并指定该用户的数据库的方法,希望对大家的工作和学习有所帮助! 方法/步骤 1 打开 MS SQL Server Ma ...

  4. 小心SQL SERVER 2014新特性——基数评估引起一些性能问题

    在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...

  5. SQL Server 2014新特性——基数评估(白皮书阅读笔记)

    基数评估 目录 基数评估 说明 基数评估准确的重要性 模型假设 启用新的基数评估 验证基数评估的版本 在迁移到新的基数评估前要测试 校验基数评估 偏差问题 需要手动处理的变化 避免因为新的CE造成性能 ...

  6. SQL Server 2014 中,新建登录用户,分配权限,并指定该用户的数据

    一.运行环境 系统:Windows 10数据库:SQL Server 2014数据库名: APP     新建的用户名: app 二.操作步骤 1.打开 MS SQL Server Managemen ...

  7. 第1/24周 SQL Server 如何执行一个查询

    大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要, ...

  8. 启用SQL Server 2014 中的OLE 自动化功能

    企业中很多架构都在快走向Service概念,尽量采用平台服务方式提供给各个Application使用.因此,个系统都会去呼叫像是Web Service,WCF或ODATA…等等各种类型的服务.一般来说 ...

  9. (4.24)sql server变量中set与select的区别

    SET vs SELECT是SQL极客之间讨论的常见话题,也是最受欢迎的面试问题之一.SET用于为变量赋值,SELECT用于赋值或从变量/ table / view等中选择值. 让我们看看在不同场景中 ...

随机推荐

  1. 来科普下游标(MSSQL)这东西。。。

    刚刚接到一个面试电话,对头的先生问我懂不懂触发器和存储过程,当时是觉得有些好笑,毕竟“视图.触发和存储”是咱数据库工程师的吉祥三宝,怎么可能不认识?只是稍后他还问了下游标这东西,仔细想想我是不常使用C ...

  2. 设计模式之美:State(状态)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):由 ConcreteState 指定它的后继 State. 意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改 ...

  3. UWP入门教程1——UWP的前世今生

    目录 引言 设备族群 UI 和通用输入模式 通用控件和布局面板 工具 自适应扩展 通用输入处理 引言 在本篇文章中,可以掌握以下知识: 设备族群,如何决定目标设备 新的UI控件和新面板帮助你适应不同的 ...

  4. 消息队列-Kafka学习

    Kafka是一个分布式的消息队列,学习见Apache Kafka文档,中文翻译见Kafka分享,一个简单的入门例子见kafka代码入门实例.本文只针对自己感兴趣的点记录下. 1.架构 Producer ...

  5. MYSQL-用户操作

    说明:本文主要写了,MYSQL对于用户的一些操作,有:查看用户,创建用户,权限的赋予,收回,用户的密码修改和删除. MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在U ...

  6. C#基础入门一

    .net(软件开发平台)-------------------------------------------------------- 学习内容:.net平台下的开发语言. .net freamwo ...

  7. Jsp+ Servlet+Ajax实现点赞功能

    1.jsp页面,使用ajax实现局部刷新 2.servlet接受处理去更新数据库 随后上传

  8. javascript事件监听与事件委托

      事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...

  9. Java中static的理解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  10. lua跨平台文件夹遍历匹配查找

    require"lfs" --[[Desc:在B路径D文件中下 搜寻A路径下的没用到的C类文件: 并且将没用到的B类文件名称打印出来: 设置好路径拖到lua自带编辑器中即可运行之; ...