随笔分类 - 03.执行计划
Execution Plans
摘要:今天我想进一步谈下SQL Server里的计划缓存和它的副作用。我们都知道,每个提交到SQL Server的逻辑查询,会编译为物理执行计划。这个执行计划然后会缓存为所谓的计划缓存,用于后期重用。现在我们首先来谈下即席SQL语句和它的负作用,还有它们带来的性能问题。 即席SQL语句(Adhoc SQL
阅读全文
摘要:几个星期前,有个网友问我一个非常有趣的问题:RECONFIGURE语句会清空计划缓存么?通常我对这个问题的答案是简单的是,但慢慢的我找出了真正的答案是“看情况啦”。我们来看下它,为什么“它看情况”。 看情况而论…… 通常你会期望RECONFIGURE语句会清空执行计划,但遗憾的是这不是真相。执行计划
阅读全文
摘要:在今天的文章里,我想谈下SQL Server里一个非常有趣的话题:在表联接里,把表指定顺序的话是否有意义?每次我进行查询和性能调优的展示时,大家都会问我他们是否应该把联接中的表指定下顺序,是否会帮助查询优化器得出一个更好性能的执行计划。我们来看下这个重要又有趣的问题。合并联接(Inner Joins...
阅读全文
摘要:今天我想谈下一个非常“简单”的话题:如何阅读执行计划。首先,这个看起来是非常简单的问题,但是当你看看的答案的细节时,它可是令人惊奇的。有2种方式阅读执行计划——从右到左,和从左到右。我们来详细看下,哪个才是正确的……从右到左?在SQL Server里,当你开始和执行计划打交道时,你总听到推荐:你应该...
阅读全文
摘要:几天前,我写了篇SQL Server里简单参数化的痛苦。今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization)。强制参数化(Forced Parameterization)在SQL Server里简单参数化有很多限制,如果你的SQL语句包含下列任...
阅读全文
摘要:你的SQL语句的参数化总是个好想法。使用参数化SQL语句你不会污染你的计划缓存——错!!!在这篇文章里我想向你展示下用参数化SQL语句就可以污染你的计划缓存,这是非常简单的!ADO.NET-AddWithValueADO.NET是实现像SQL Server关系数据库数据访问的.NET框架的组成——有...
阅读全文
摘要:今天我想谈下SQL Server里的针对即席工作负荷进行优化(Optimize for Adhoc Workload)服务器配置选项,还有它如何影响你的计划缓存。在我们挖掘细节之前,我想向你展示下SQL Server如何重用缓存的执行计划。执行计划重用每次你提交一个查询给SQL Server,SQL...
阅读全文
摘要:问:使用NC扫描运算符,有方法知道索引是怎么扫描的么?这个问题的一个答案是非聚集索引扫描总是扫描整个索引。答:是的,总是100%。扫描运算符总是整个索引……但是有一些特定的情况并不是这样。在这篇文章里我想专门讲下你总会碰到的一个特定案例——在你的查询里有TOP,MIN或者MAX表达式。TOP,MIN...
阅读全文
摘要:在今天的文章里,我想谈下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...
阅读全文
摘要:在上一篇文章里,我讨论了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()子句进行你的分析计算来打开你的窗口,...
阅读全文
摘要:在上一篇文章里我讨论了SQL Server里Grouping Sets的功能。从文中的例子可以看到,通过简单定义需要的分组集是很容易进行各自分组。但如果像从所给的列集里想要有所有可能的分布——即所谓的幂集(Power Set),要怎么做呢?当然,你可以用grouping set的语法功能来手动生成幂...
阅读全文
摘要:在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务)。我不是说在生产里使用开发版,也不是说安装盗版SQL Server。不可能的任务?未必,因为通过SQL Server里所谓的Grouping Sets就可以。在这篇文章里我会给你概括...
阅读全文
摘要:在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符。我经常引用这个与语言结构是SQL Server里最危险的一个——很快你就会知道为什么。在我们进入特定问题和陷阱前,首先我想给你下使用SQL Server里的PIVOT...
阅读全文
摘要:在今天的文章里我想谈下SQL Server里与索引相关的特殊性能问题。问题描述假设下列的简单查询,在你的日常SQL Server里,这样的查询你已经看到过几百遍了:1 -- Results in an Index Scan2 SELECT * FROM Sales.SalesOrderHeader3...
阅读全文
摘要:从Paul White的推特上看到,在SQL Server 2014里,对于表变量(Table Variables),它是支持非唯一聚集索引(Non-Unique Clustered Indexes)和非聚集索引(Non-Clustered Indexes)的。看到这个,我决定在自己的虚拟机里尝试下...
阅读全文
摘要:最近购买了《SQL Server 2008 内核剖析与故障排除》这本书,现对第5章 CPU和查询处理,5.4节 查询处理,这一篇幅的内容进行图解,希望可以帮助大家更好的理解查询。SQL Server通过4个步骤处理一个查询:分析、绑定、优化、执行。分析、绑定、优化都在关系引擎中完成。优化输出已调度好...
阅读全文