06 2015 档案
摘要:在一些先决条件下,SQL Server可以缓存临时表(cache Temp Tables)。缓存临时表意味着当你创建反复创建同个临时表时,SQL Server就可以重用它们。这会从整体上大幅度提高你的工作量(性能),因为SQL Server不需要访问内存里的特定页(PFS,GAM,SGAM),经常访...
阅读全文
摘要:从Paul White的推特上看到,在SQL Server 2014里,对于表变量(Table Variables),它是支持非唯一聚集索引(Non-Unique Clustered Indexes)和非聚集索引(Non-Clustered Indexes)的。看到这个,我决定在自己的虚拟机里尝试下...
阅读全文
摘要:在这篇文章里,我想给出如何与终极事务处理(Extreme Transaction Processing (XTP))的第一次接触,即大家熟知的Hakaton。如果你想对XTP有个很好的概况认识,我推荐Kalen Delaney写的关于它的白皮书,中文版本点此下载,另外微软研究院也发布了题为“对于内存...
阅读全文
摘要:欢迎来到性能调优培训的第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的职责就是找出问题所在,并解决它们。问题解决第一步...
阅读全文