08 2015 档案
摘要:今天我想谈下一个非常“简单”的话题:如何阅读执行计划。首先,这个看起来是非常简单的问题,但是当你看看的答案的细节时,它可是令人惊奇的。有2种方式阅读执行计划——从右到左,和从左到右。我们来详细看下,哪个才是正确的……从右到左?在SQL Server里,当你开始和执行计划打交道时,你总听到推荐:你应该...
阅读全文
摘要:几天前,我写了篇SQL Server里简单参数化的痛苦。今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization)。强制参数化(Forced Parameterization)在SQL Server里简单参数化有很多限制,如果你的SQL语句包含下列任...
阅读全文
摘要:大家好,欢迎回到性能调优培训的第22周。上周我谈了SQL Server里的基线,今天我们继续,谈下SQL Server里的等待和I/O延迟统计。当我进行SQL服务器健康检查时,我总会使用这2个维度全局掌握下SQL Server的健康状况。等待统计(Wait Statistics)在SQL Serve...
阅读全文
摘要:你的SQL语句的参数化总是个好想法。使用参数化SQL语句你不会污染你的计划缓存——错!!!在这篇文章里我想向你展示下用参数化SQL语句就可以污染你的计划缓存,这是非常简单的!ADO.NET-AddWithValueADO.NET是实现像SQL Server关系数据库数据访问的.NET框架的组成——有...
阅读全文
摘要:今天我想谈下SQL Server里的针对即席工作负荷进行优化(Optimize for Adhoc Workload)服务器配置选项,还有它如何影响你的计划缓存。在我们挖掘细节之前,我想向你展示下SQL Server如何重用缓存的执行计划。执行计划重用每次你提交一个查询给SQL Server,SQL...
阅读全文
摘要:在今天的文章里我想谈下SQL Server里非常重要的话题,当人们第一次使用SQL Server时是最会混淆的。即主键约束(Primary Key constraint)和聚集索引(Clustered Index)的区别。什么是主键(Primary Key)首先让我们谈下主键约束本身。顾名思义它只是...
阅读全文
摘要:在今天的文章里,我想向你展示下SQL Server里一个未公开的函数,还有你如何用那个函数来找出在哪页记录被存储。%%lockres%%今天我想向你展示的未公开函数叫做%%lockres%%,它与SQL Server的锁实现有关。我们都知道,SQL Server实现锁层级并在记录层,页层,表层请求锁...
阅读全文
摘要:一些人总当NOLOCK查询提示是SQL Server里的加速器,因为它避免了大量的死锁情景。在这篇文章里,我想向你展示下为什么NOLOCK查询提示是个不好的想法。脏读(Dirty Reads)NOLOCK查询提示一个最大的副作用就是在你的记录集会出现所谓的脏读这个事实。我们来看下面的代码:1 BEG...
阅读全文
摘要:问:使用NC扫描运算符,有方法知道索引是怎么扫描的么?这个问题的一个答案是非聚集索引扫描总是扫描整个索引。答:是的,总是100%。扫描运算符总是整个索引……但是有一些特定的情况并不是这样。在这篇文章里我想专门讲下你总会碰到的一个特定案例——在你的查询里有TOP,MIN或者MAX表达式。TOP,MIN...
阅读全文
摘要:大家好,欢迎来到性能调优培训的最后一个月。在过去的5个月里,我们谈了SQL Server的各种性能相关的话题,包括性能调优的技术和问题。但当在你面前,SQL Server没有按你预想的运行时,你会怎么办?为了帮你处理这个情况,今天我们会谈到下性能监控技术,下周我们会详细谈到SQL Server里所谓...
阅读全文
摘要:在今天的文章里,我想谈下SQL Server里非常有争议和复杂的话题:ORDER BY子句的歧义性。视图与ORDER BY我们用一个非常简单的SELECT语句开始。1 -- A very simple SELECT statement2 SELECT * FROM Person.Person3 OR...
阅读全文
摘要:在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用。首先,如果你的SQL语句包含这些,简单参数化不会发生:JOININBULK INSERTUNIONINT...
阅读全文
摘要:我经常会被反复问到这样的问题:”我有一个性能很差的SQL Server。我如何找出最差性能的查询?“。因此在今天的文章里会给你一些让你很容易找到问题答案的信息向导。问SQL Server!SQL Server的一个优点是它本身能回答几乎所有你的问题,因为SQL Server在各个DMV和DMF里存储...
阅读全文
摘要:在今天的文章里我想详细谈下SQL Server里的统计等待(Wait Statistics),还有她们如何帮助你立即为什么你的SQL Server当前很慢。一提到性能调优,对我来说统计等待是SQL Server了最重要的概念。查询为什么等待在SQL Server里每次你执行1个查询,查询总需要等待。...
阅读全文
摘要:UNIQUEIDENTIFIER列上的统计信息非常有意思,在它上面有一些很令人讨厌的行为。我们来看下。问题重现(The repro)为了向你展示我们刚抱怨的行为,我用下列简单的表定义创建了一个数据库,我在UNIQUEIDENTIFIER列上强制主键约束。这意味着SQL Server在后台会生成唯一聚...
阅读全文
摘要:嗯,有些人在看玩这篇文章后会恨我,但我还是要说。1个月来我在内存中OLTP这个里领域里做了大量的工作,很多用户都请求使用这个惊艳的新技术。遗憾的是,关于内存中OLTP没有一个是真的令人激动的——看完你就知道了。内存中OLTP有问题么?没有!真的!我喜欢这个惊艳的新技术,但我还不能推荐它给任何用户。就...
阅读全文
摘要:大家好,欢迎回到性能调优培训。今天讨论SQL Server里的死锁(Deadlocking),第5个月的培训就结束了。当2个查询彼此等待,没有查询可以继续它的工作就会发生死锁。第一步我会概括介绍下SQL Server如何处理死锁。最后我会向你展示下SQL Server里一些特定死锁,还有你如何避免并...
阅读全文
摘要:在今天的文章里,我想详细讨论下内存中OLTP里的事务日志如何写入事务日志。我们都知道,对于你的内存优化表(Memory Optimized Tables),内存中OLTP提供你2个持久性(durability)选项:SCHEMA_ONLYSCHEMA_AND_DATA今天我不想更多讨论SCHEMA_...
阅读全文
摘要:你用安装向导安装了全新的SQL Server,最后你点击了完成按钮。哇噢~~~现在我们可以把我们的服务器进入生产了!抱歉,那并不是真的,因为你的全新SQL Server默认配置是错误的。是的,你没看错:SQL Server的默认安装在很多方面的配置是错误的。在今天的文章里,我想给你展示下,为了更快的...
阅读全文
摘要:在上一篇文章里,我讨论了INTERSECT设置操作的基础,它和INNER JOIN的区别,还有为什么需要好的索引设计支持。今天我想谈下SQL Server里并未实现的INTERSECT ALL操作。INTERSECT ALL是SQL特性的一部分,但SQL Server并不考虑它。和INTERSECT...
阅读全文
摘要:在今天的文章里,我想讨论下SQL Server里的INTERSECT设置操作。INTERSECT设置操作彼此交叉2个记录集,返回2个集里列值一样的记录。下图演示了这个概念。INTERSECT与INNER JOIN你会发现,它和2个表间的INNER JOIN几乎一样。但今天我会介绍它们之间的一些重要区...
阅读全文
摘要:内存中OLTP是关于内存中的一切。但那只是对了一半。在今天的文章里我想给你展示下,当你从内存读取数据时,即使内存中OLTP也会引起磁盘活动。这里的问题是执行计划里,不正确的统计信息与排序(sort)运算符的组合。排序(sort)运算符问题我们都知道,排序(sort)运算符需要所谓的内存授予(Memo...
阅读全文
摘要:几乎每次我展示SQL Server里的窗口时,人们都非常有兴趣知道,当你定义你的窗口(指定的一组行)时,ROWS与RANGE选项之间的区别。因此在今天的文章里我想给你展示下这些选项的区别,对于你的分析计算意味着什么。ROWS与RANGE之间的区别当你用OVER()子句进行你的分析计算来打开你的窗口,...
阅读全文
摘要:我是个懒人,我只想干尽可能少的活。当我干活的时候我不想太多。是,你没看错,这看起来很糟糕,作为一个DBA这很不合格。但在今天的文章里,我想给你展示下,当你想对特定查询创建索引设计时,你如何把你的工作和思考过程传达给查询优化器。听起来很有意思?嗯,那就进入我的索引调优世界吧!有问题的查询我们来看下列查...
阅读全文
摘要:大家好,欢迎回到性能调优培训。上2个星期我们已经讨论了SQLServer里的悲观和乐观锁。今天我想谈下SQL Server里对于锁的一个特殊现象:所谓的锁升级(Lock Escalations)。在我们进入那个问题的细节前,我想先谈下SQL Server内部使用的锁层级(Lock Hierarchy...
阅读全文
摘要:在今天的文章里我会讨论下可串行化(SERIALIZABLE)隔离级别里会有的锁升级(Lock Escalations),还有你如何避免。在上个月的7月14日,我已经介绍了SQL Server里锁升级(Lock Escalations)的基本概念还有为什么需要它们。因此请你回到这个文章来理解下这个非常...
阅读全文
摘要:在今天的文章里我想谈论下在可重复读隔离级别(Transaction Isolation Level Repeatable Read)里,当你运行事务时可能引起的2类死锁。当你使用可重复读(Repeatable Read)隔离级别设置你的事务,SQL Server对读取数据把持需要的共享锁(Share...
阅读全文
摘要:在今天的文章里我想演示下SQL Server里在表上丢失索引如何引起死锁(deadlock)的。为了准备测试场景,下列代码会创建2个表,然后2个表都插入4条记录。 1 -- Create a table without any indexes 2 CREATE TABLE Table1 3 ( 4 ...
阅读全文
摘要:一个星期前,我写了关于SQL Server里闩锁(Latches)和自旋锁(Spinlocks)的文章。2个同步原语(synchronization primitives)是用来保护SQL Server里的共享数据结构,例如缓存池里的页(通过闩锁(Latches)),锁管理器哈希表里的锁(通过自旋锁...
阅读全文