大家好,欢迎回到性能调优培训。上个星期我们讨论在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. 网易云信,发送验证码短信C#版代码

    网易云信发送短信代码(C# 版)....需要注意SHA1 String有转换小写!!!! using System; using System.Collections.Generic; using S ...

  2. 公共代码参考(Volley)

    Volley 是google提供的一个网络库,相对于自己写httpclient确实方便很多,本文参考部分网上例子整理如下,以作备忘: 定义一个缓存类: public class BitmapCache ...

  3. 淘宝UWP--自定义图片缓存

    一.应用场景 在淘宝应用首页,会有很多张图片,而这些首页图片不会经常改变,所以就需要缓存下来.这样就不必每次都从网络获取. 二.比较对象 1.系统缓存 对于系统缓存,我们不需要做什么处理.只需要把网络 ...

  4. Java设计模式3:工厂方法模式

    工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...

  5. 【C语言学习】《C Primer Plus》第9章 函数

    学习总结 1.函数有利于我们可以省去重复的代码,函数可以使程序更加模块化,从而有利于程序的阅读.修改和完善.我们在系统设计或架构设计的时候,往往追求的是模块化.组件化.松耦合,而函数就是其代码的表现. ...

  6. 作业八—Alpha阶段项目总结

    一.项目的预期目标: 我们的图书管理系统之前的目标是做出可以让读者和管理员采用不同的搜索方式,并且时要做到读者和管理者两种不同的方式的!但是我们目前做到了部分搜索方式和管理员界面,主要原因是该项目如果 ...

  7. karma作为jQuery单元测试Runner

    karma作为angular测试runner出现,如果你使用过karma一定感受到这很不错的javascript测试runner.简单干净的配置文件karma.config.js,以及karma in ...

  8. 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  9. iOS基本动画/关键帧动画/利用缓动函数实现物理动画效果

    先说下基本动画部分 基本动画部分比较简单, 但能实现的动画效果也很局限 使用方法大致为: #1. 创建原始UI或者画面 #2. 创建CABasicAnimation实例, 并设置keypart/dur ...

  10. 大叔也说Xamarin~Android篇~日志的记录

    回到目录 无论哪个平台,开始哪种应用程序,日志总是少不了的,大家在Lind.DDD里也可以看到大叔的日志组件,而在xamarin进行移动开发时,为了更好的调试,记录运行的情况,日志也是必须的,这讲主要 ...