05 2015 档案
摘要:在性能调优:理解Set Statistics IO输出我们讨论了Set Statistics IO,还有如何帮助我们进行性能调优。这篇文章会讨论下Set Statistics Time,它会告诉我们执行一个查询需要的时间。我们用一个例子来开始。 1 USE AdventureWorks2008r2 ...
阅读全文
摘要:性能调优是DBA的重要工作之一。很多人会带着各种性能上的问题来问我们。我们需要通过SQL Server知识来处理这些问题。经常被问到的一个问题是:早上这个存储过程运行时间还是可以的,但到了晚上就很慢很慢。对此,我们可以笑着回答:这个存储过程运行多次后,已经累趴了,所以很慢。存储过程或语句运行时间取决...
阅读全文
摘要:欢迎回到性能调优培训。今天标志着第3个月的培训开始了,这个月我们全部学习SQL Server里的执行计划。执行计划在SQL Server里是你需要理解的,最重要的概念,对它做出有效的调整,就可以提高查询性能。因此今天我会大致介绍下SQL Server里的执行计划,还有你如何读懂它们。为什么会有执行计...
阅读全文
摘要:在帮助优化器选择正确的执行计划,统计信息是一个重要因素。因此,我们在处理性能问题时,要足够重视统计信息。可能是对统计信息知识及其相关机制的缺乏,忽略统计信息往往是造成性能问题的根源。查询优化器在每一步使用统计信息判断返回的行数。在执行计划里的预估行数信息是基于列上的可用统计信息计算而来的。统计信息会...
阅读全文
摘要:在 理解统计信息(4/6):自动更新统计信息的阀值——人为更新统计信息的重要性里,我们讨论了自动更新统计信息的阀值,这个阀值在某些情况下,基于自动更新的统计信息还是可以获得最优的执行计划的。在大多数情况下,人为更新统计信息可以获得更好的性能。这个文章,我们可以来看下如何检测过期的统计信息。在SQL ...
阅读全文
摘要:在理解统计信息(3/6):谁创建和管理统计信息?在性能调优中,统计信息的作用里我们讨论了统计信息的自动创建和自动更新。我们真的需要人为维护统计信息来保持性能最优?答案是肯定的,这取决与你的工作量。SQL Server只在达到阀限值时进行统计信息的自动更新。当大量的Insert/Update/Dele...
阅读全文
摘要:在理解统计信息(2/6):直方图中,我们讨论了直方图,密度向量,还有SQL Server如何用统计信息做基数计算(cardinalityestimation)。这篇文章会讨论统计信息如何被创建,还有统计信息在性能调优中的重要性。有2类统计信息,索引统计信息和列统计信息。索引统计信息是索引创建的一部分...
阅读全文
摘要:在理解统计信息(1/6):密度向量里,我们讨论了在统计里存储的密度向量信息。这篇文章会讨论下直方图。我们再次创建SalesOrderDetail表的副本,并在上面建立2个索引。1 USE StatisticsDB2 GO3 SELECT * INTO SalesOrderDetail FROM Ad...
阅读全文
摘要:时间过得真快——再过几分钟,你就要完成第2个月的性能调优培训。今天这部分培训我想讲下非聚集索引的更多信息,还有你会碰到它的一些负作用。上一星期我们讨论了SQL Server里的书签查找,它是非常危险的。在执行计划里SQL Server访问非聚集索引时,额外列必须要从表本身获取时(因为它们不是非聚集索...
阅读全文
摘要:在日常生活中,我们用统计信息来采取决定。SQL Server优化器也用同样的方式,使用统计信息来选择正确的执行计划。如果统计信息错误或过期,SQL Server可能就会选择错误的执行计划。在这个文章里,我们换个方式理解下统计信息。查询优化器使用统计信息来判断每一步返回的行。执行计划里的估计行数信息是...
阅读全文
摘要:在索引碎片里我们解释了不同类型的碎片,还有它们如何影响查询性能。在这个文章里,我们会讨论下如何检测索引碎片。内部碎片检测内部碎片是关于页面饱和度的一切,可以用DETAILED模式的sys.dm_db_index_physical_stats,avg_page_space_used_in_percen...
阅读全文
摘要:这篇文章会解释下不同类型的碎片。理解索引碎片的概念对有效检测和移除碎片非常重要。什么是碎片碎片可以定义为:任何情况下,在访问一个表时,造成比适量更多的磁盘IO操作或更长的磁盘IO操作。SELECT查询的最佳操作发生在,表的数据页是尽可能连续的,而且页是尽可能完整打包(fully packed)的。碎...
阅读全文
摘要:在过去的文章里,我们已经讨论了各种不同索引。这个文章里,我们会讨论下键列的顺序(索引列的顺序)。索引键列的顺序基于数据的访问模式还有你想如何组织数据。对于索引键列的顺序,常规指导方针就是把查询用到最多的列放在第一列。这并不是说,所有你索引里的唯一ID列就应该是第一列。优化器是基于索引上的可用统计信息...
阅读全文
摘要:过滤索引(Filtered index)是在SQL Server 2008里新引入的功能。到目前我们谈到的索引都是在建立在整张表上的。换句话说,索引和表有一样的记录树。使用过滤索引,我们可以创建表子集的索引。这个可以通过创建索引的时候加上where子语完成。这个可以帮助在存储上减小索引的大小同样索引...
阅读全文
摘要:在索引深入浅出:非聚集索引的B树结构在聚集表里,在聚集表里,我们看到非聚集索引的叶子层只包含非聚集索引键和聚集索引键。从聚集表结构或堆表结构里拿到剩下列,SQL Server需要进行书签/键查找操作。很多情况下书签或键查找非常消耗资源。我们来看个例子。在这里我们打开了IO统计信息,还有点击工具栏的显...
阅读全文
摘要:在索引深入浅出:非聚集索引的B树结构在聚集表里,我们讨论了非聚集索引。我们提到,唯一非聚集索引可以让所讨论的问题变得简单很多。我们已经知道了非聚集索引的通用结构,现在我们来看下在非唯一列上的非聚集索引的存储结构。在索引深入浅出:选择正确并合适的聚集索引键里,我们讨论了在非唯一列上如何管理聚集键。我们...
阅读全文
摘要:今天我们来探讨下聚集索引的设计要求。在选择聚集索引键时,有好几点需要考虑的。选择聚集索引键没有硬性规定。多实践,多从网上找问题的答案都会帮你找到正确的索引键。唯一性(Uniqueness)SQL Server允许你在非唯一列创建聚集索引,但是唯一性是任何索引最理想的属性,尤其对于聚集索引。即使SQL...
阅读全文
摘要:在“索引深入浅出:非聚集索引的B树结构在聚集表”里,我们讨论了在聚集表上的非聚集索引,这篇文章我们讨论下在堆表上的非聚集索引。非聚集索引可以在聚集表或堆表上创建。当我们在聚集表上创建非聚集索引时,聚集索引键担当为行指针。在堆表里,文件号,页号和槽号(file id , page number and...
阅读全文
摘要:上个星期我讨论了SQL Server里的聚集索引。当你在表上定义了一个聚集索引,你是物理上把你的表数据按提供的聚集键列的顺序存储。在SQL Server里,一个表只能定义一个聚集索引,非聚集索引可以定义多个(最多999个)。非聚集索引是第二索引,你可以在表上列进行定义。你也可以把非聚集索引与书比较。...
阅读全文
摘要:一个表只能有一个聚集索引,数据行以此聚集索引的顺序进行存储,一个表却能有多个非聚集索引。我们已经讨论了聚集索引的结构,这篇我们会看下非聚集索引结构。非聚集索引的逻辑呈现简单来说,非聚集索引是表的子集。当我们定义了一个非聚集索引时,SQL Server把整套非聚集索引键存在不同的页里。我们来看下一个包...
阅读全文
摘要:在SQL Server里,有2种表是以存储为基础的。有聚集索引的表叫聚集表,没有聚集索引的表叫堆表。在上一篇文章,我们讨论了堆表的特性和存储结构。在这篇文章里,我们来看下聚集表。有聚集索引的表叫聚集表。聚集索引保存了使用B树结构的聚集键,并只能以此顺序存储实际的数据。这也是SQL Server限制一...
阅读全文
摘要:在上一个文章里,我们理解了有聚集索引表和没有聚集索引表之间的区别。有聚集索引的表叫聚集表。没有聚集索引的表叫堆表(heap table)。堆表(heap table)没有聚集索引的表堆表在sys.partitions里有1条index_id = 0 的记录数据存储没有任何的顺序,插入数据也没顺序由于...
阅读全文
摘要:很多人对索引都没有一个清晰的认识,对于聚集索引和非聚集索引之间的区别也不是很清楚。如果有人问我索引是什么,我觉得这个问题有点大,很难在一篇文章里解释清楚。所以我决定尝试写这一系列文章,用一个简单的,可以理解的方法解释索引,尽管网上关于索引的文章有一箩筐那么多。简单来说,索引帮助数据库引擎使用最小的资...
阅读全文
摘要:本篇是“索引深入浅出”的开篇,也是这个系列文章的聚集索引页,下面文章标题排列顺序将和对应文章发布顺序一致:索引简介:索引概述,通过现实生活实例理解聚集索引、非聚集索引还有键查找(Key Look up)。索引深入浅出(1/10):索引简介。堆表:没有聚集索引的表叫堆表。在堆表中的数据存储没有任何顺序...
阅读全文
摘要:这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的。我们都已经知道,SQL Server把数据文件分成8k的页,页是IO的最小操作单位。SQL Server把数据文件里的第1页标记为0。在所有数据库文件里,前面的9个页面(到页号8)都是如下显示一样的顺序,第10个页(页号9)是启动页...
阅读全文
摘要:今天我们来讨论下批量更改映射(Bulk Changed Map:BCM)页,还有大容量日志恢复模式(bulk logged recovery model)如何运作的。批量更改映射(Bulk Changed Map:BCM):SQL Server使用BCM页来跟踪自上次完全备份后,被大容量日志操作修改...
阅读全文
摘要:我们已经讨论了各种不同的页,包括数据页、GAM与SGAM页、PFS页,还有IAM页。今天我们来看下差异变更页(Differential Change Map:DCM),还有差异备份(differential backups)。差异变更页(Differential Change Map:DCM ) :...
阅读全文
摘要:在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页。今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页。在SQL Server 2005和以后的版本里,分配单元(allocation units)以下三个类型:IN_ROW_DATA用于存储堆分区或索...
阅读全文
摘要:我们已经讨论了GAM与SGAM页,数据页(Data Page) ,现在我们来看下页面自由空间页(Page Free Space (PFS))。PFS在数据文件里是第2页(页号1,页号从0开始),接在文件头(file header,页号0)后。GAM与SGAM是用来跟踪区分配情况,而PFS页是用来跟踪...
阅读全文
摘要:我们知道SQL Server在8K 的页里存储数据。分区就是物理上连续的8个页。当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据。GAM(Global Allocation Map)和SGAM(Shared Global Allocation Map)页用...
阅读全文
摘要:在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下。数据记录存储我们具体的数据,换句话说,它存在堆表里,或者存在聚集索引的叶子节点。数据记录结构是为了让SQL Server更高效的管理数据。我们来看...
阅读全文
摘要:我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行。也就是说,SQL Server 读取或写入所有数据页。页有不同的类型,像数据页,GAM,SGAM等。在这文章里,让我们一起来理解下数据页结构。SQL Server把数据记录存在数据页(...
阅读全文
摘要:上个星期我向你介绍了堆表(heap tables)。我们说过,在SQL Server表可以是堆表(Heap Table)或者聚集表(Clustered Table)——一个在它上面有聚集索引(Clustered Index)定义的表。今天我们来谈论聚集索引(Clustered Index)的更多细节...
阅读全文
摘要:一个简单的更新查询现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么。这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答。庆幸的是,直到存取方法(Access Methods)前,更新操作和刚才SELECT语句流程是一模一样的。这次存取方法(Acc...
阅读全文
摘要:计划缓存(Plan Cache)如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的。如果没找到被缓存的计划,然后命令分析器(Command Parser)在T-SQL基础上生成一个查询树(query t...
阅读全文
摘要:为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程。最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程。关系和存储引擎如图所示,SQL Server被分为2个主要引擎:关系引擎和存储引擎。关系引擎有时也被称为查询处理器,因为它的主...
阅读全文