摘要:
欢迎来到性能调优培训的第4个月。这个月全是关于SQL Server里的统计信息,还有它们如何帮助查询优化器生成足够好的执行计划。统计信息主要是被查询优化器用来估计查询返回的行数。它只是个估计,没别的。统计信息概述SQL Server使用在统计信息对象里称作直方图(Histogram)的东西,它描述了... 阅读全文
摘要:
今天这篇文章我想谈下堆表上特有的性能问题:转发记录(Forwarding Records)。首先我们要澄清下什么是堆表:堆表就是没有聚集索引定义的表。它对插入新记录非常快,但当你读取数据时非常慢。读取数据会在你的存储子系统上引入随机存取(random I/O),有时候当你碰到转发记录,它会进一步降低... 阅读全文
摘要:
当同个对象上有互斥的锁存在时,查询需要等待很长时间,我们是否可以收到来自SQL Server提醒?答案是可以的,做法非常简单,因为SQL Server为你提供了称为Blocked Process Report 的功能。很可惜这个功能默认是未启用的。因此这篇文章我想给你讲解下Blocked Proce... 阅读全文
摘要:
最近购买了《SQL Server 2008 内核剖析与故障排除》这本书,现对第5章 CPU和查询处理,5.4节 查询处理,这一篇幅的内容进行图解,希望可以帮助大家更好的理解查询。SQL Server通过4个步骤处理一个查询:分析、绑定、优化、执行。分析、绑定、优化都在关系引擎中完成。优化输出已调度好... 阅读全文
摘要:
今天我想谈下一个特别的等待类型,这个等待可以说是有时很难进行故障排除:线程池(THREADPOOL)等待。这个等待类型是SQL Server内部线程调度机制特有的。或许你已经知道SQL Server内部使用自有的“操作系统”来实现线程调度和内存管理——SQLOS。SQLOS提供一系列的工作者线程,用... 阅读全文
摘要:
首先我们来看一个带排序的查询,点击工具栏的显示包含实际的执行计划。1 SELECT * FROM AdventureWorks2008R2.Person.Person WHERE FirstName LIKE 'w%' ORDER BY 1从执行计划里可以看出,SELECT运算符包含了内存授予(Me... 阅读全文
摘要:
在这一期的性能调优培训里,我想详细讲解下SQL Server里的并行执行计划(Parallel Execution Plans) 。执行一个有并行执行计划的查询,意味着SQL Server从执行计划里进行必须的运算符需要使用多线程。首先我会介绍下并行执行计划里最常用的运算符,然后我们来分析下SQL ... 阅读全文
摘要:
这篇文章我想谈下空值位图掩码(NULL bitmap mask) ,并揭开它的神秘面纱。空值位图掩码是在存储引擎层为列是否存储NULL值进行编码。它是一个简单的位图掩码,如果值是1的话,表示这列有NULL值,如果是0的话,表示这列有具体的值(非NULL值)。这样的解释听起来非常直接,但当我们进一步分... 阅读全文
摘要:
自SQL Server 2005起,我们有了READ COMMITTED SNAPSHOT ISOLATION level (RCSI) 和SNAPSHOT ISOLATION level (SI)两个事务隔离级别。当你使用这些事务隔离级别时,读操作(SELECT语句)在读的时候不需要S锁(共享锁)... 阅读全文
摘要:
这篇文章我想谈下SQL Server如何在变长列上存储索引。首先我们创建一个包含变长列的表,在上面定义主键,即在上面定义了聚集索引,然后往里面插入80000条记录: 1 -- Create a new table 2 CREATE TABLE Customers 3 ( 4 Customer... 阅读全文
摘要:
在上一篇文章里,我谈了唯一聚集索引上的唯一和非唯一非聚集索引的区别。在这篇文章里,我想谈下非唯一聚集索引上的唯一和非唯一聚集索引的区别。我们都知道,SQL Server内部把非唯一聚集索引当作唯一聚集索引处理的。如果你定义了一个非唯一聚集索引,SQL Server会增加叫做uniquifier到你的... 阅读全文
摘要:
在上一篇文章里,我讨论了使用临时表如何引起SQL Server里的重编译。在文章最后我提到,今天这篇文章我会聚焦表变量(Table Variables)的更多信息,它可以避免重编译的昂贵开销。我们来详细分析下。表变量(Table Variables)表变量总局限于提交到SQL Server的批处理语... 阅读全文
摘要:
这篇文章我想谈下SQL Server里一个非常重要的性能调优话题:重编译(Recompilations) 。当你执行非常简单的存储过程(使用临时表)时,就会发生。今天我想奠定SQL Server里重编译的基础,它们为什么会发生,下篇文章我会向你展示通过不同方式重写你的存储过程避免重编译。什么是重编译... 阅读全文
摘要:
今天我想谈下性能调优培训里的重编译(Recompilations)。当你执行一个查询,SQL Server里另一个变动使你执行计划的剩余部分无效,就会发生重编译。在那个情况下SQL Server需要保证你执行计划的准确性,重编译就会被触发。重编译会给你的SQL Server带来额外的CPU开销。什么... 阅读全文
摘要:
在上篇文章里,我讨论了唯一和非唯一聚集索引的区别。我们已经知道,SQL Server内部使用4 bytes的uniquifier来保证非唯一聚集索引行唯一。今天我们来看下唯一聚集索引上,唯一和非唯一非聚集索引的区别。当我们在表上定义PRIMARY KEY约束时,SQL Server会为我们创建唯一聚... 阅读全文
摘要:
在上一篇文章里,我们讨论了堆表上唯一/非唯一非聚集索引。在SQL Server里没有聚集索引定义的叫堆表。当你在堆表上定义了一个聚集索引,你的表数据就会重组按聚集键的顺序进行物理存储,因为这个表叫做聚集表。这篇文章里,我想谈下唯一和非唯一聚集索引之间的区别,这2类聚集索引对存储的影响。看这个文章之前... 阅读全文
摘要:
在这篇文章里,我想详细介绍下SQL Server里唯一与非唯一非聚集索引的区别。看这个文章前,希望你已经理解了聚集和非聚集索引的概念,还有在SQL Server里是如何使用的。很多人对唯一和非唯一索引非聚集索引的认识都不是很清晰。事实上,SQL Server在存储上这2类索引有着本质的区别,这些区别... 阅读全文
摘要:
有个问题:在执行计划里运算符的估计行数是42,但是你知道查询的正确行数不是42。你也听说了SQL Server使用统计信息来作此估计的?但我们怎么看懂统计信息,来理解这里的估计是怎么来的?今天我想谈下SQL Server里的统计信息,在直方图(histogram)和密度向量(density vect... 阅读全文
摘要:
在参数嗅探(Parameter Sniffing)(1/2)里,我介绍了SQL Server里参数嗅探的基本概念和背后的问题。如你所见,当缓存的计划被SQL Server盲目重用时,会带来严重的性能问题。今天我会向你展示下如何处理这个问题,即使用不同的技术克服它。索引(Index)上次我们讨论造成参... 阅读全文
摘要:
这个问题会在参数话的SQL语句(例如存储过程)与SQL Server里的计划缓存机制结合的时候会出现。这个文章分为2个部分,第1部分会介绍下参数嗅探(Parameter Sniffing)的概况,第2部分我们介绍下如何解决这个问题。什么是参数嗅探(Parameter Sniffing)在SQL Se... 阅读全文
摘要:
在这一期的性能调优培训里,我想详细谈下SQL Server里计划缓存及其副作用。在上一周你已经学到,每个提交给SQL Server的逻辑查询会编译成物理执行计划。那个执行计划然后会被缓存,即被称为计划缓存,用作后期的重用。首先我们来看下即席SQL语句(adhoc SQL statements,对应的... 阅读全文
摘要:
当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据。我们来看看下面的表和索引定义: 1 CREATE TABLE Customers 2 ( 3 CustomerID INT NOT NUL... 阅读全文
摘要:
在上3篇文章里,我们讨论了列出反映服务器当前状态的不同查询。初涉SQL Server性能问题(1/4):服务器概况初涉SQL Server性能问题(2/4):列出等待资源的会话初涉SQL Server性能问题(3/4):列出阻塞的会话这篇文章我们看下从计划缓存里列出执行状态。 1 /********... 阅读全文
摘要:
在 初涉SQL Server性能问题(2/4)里,我们讨论了列出等待资源或正运行的会话脚本。这篇文章我们会看看如何列出包含具体信息的话阻塞会话清单。 1 /************************************************************************... 阅读全文
摘要:
在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数。这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结果。问题检测的第2步是获取在进行任何资源等待的会话。下面的脚本会帮助我们获得这些信息。这个查询需要预... 阅读全文
摘要:
当你作为DBA时,很多人会向你抱怨:“这个程序数据加载和蜗牛一样,你看看是不是服务器出问题了?”造成这个问题的原因有很多。可能是程序应用服务器问题,网络问题,程序实现方式问题,数据库服务器负荷过重。不管是哪个问题,数据库总是第一个被抱怨的。我们DBA的职责就是找出问题所在,并解决它们。问题解决第一步... 阅读全文
摘要:
在性能调优:理解Set Statistics IO输出我们讨论了Set Statistics IO,还有如何帮助我们进行性能调优。这篇文章会讨论下Set Statistics Time,它会告诉我们执行一个查询需要的时间。我们用一个例子来开始。 1 USE AdventureWorks2008r2 ... 阅读全文
摘要:
性能调优是DBA的重要工作之一。很多人会带着各种性能上的问题来问我们。我们需要通过SQL Server知识来处理这些问题。经常被问到的一个问题是:早上这个存储过程运行时间还是可以的,但到了晚上就很慢很慢。对此,我们可以笑着回答:这个存储过程运行多次后,已经累趴了,所以很慢。存储过程或语句运行时间取决... 阅读全文
摘要:
欢迎回到性能调优培训。今天标志着第3个月的培训开始了,这个月我们全部学习SQL Server里的执行计划。执行计划在SQL Server里是你需要理解的,最重要的概念,对它做出有效的调整,就可以提高查询性能。因此今天我会大致介绍下SQL Server里的执行计划,还有你如何读懂它们。为什么会有执行计... 阅读全文
摘要:
在帮助优化器选择正确的执行计划,统计信息是一个重要因素。因此,我们在处理性能问题时,要足够重视统计信息。可能是对统计信息知识及其相关机制的缺乏,忽略统计信息往往是造成性能问题的根源。查询优化器在每一步使用统计信息判断返回的行数。在执行计划里的预估行数信息是基于列上的可用统计信息计算而来的。统计信息会... 阅读全文