第8/24周 覆盖索引 临界点

时间过得真快——再过几分钟,你就要完成第2个月的性能调优培训。今天这部分培训我想讲下非汇集索引的更多信息,还有你会碰到它的一些负做用。html

上一星期咱们讨论了SQL Server里的书签查找,它是很是危险的。在执行计划里SQL Server访问非汇集索引时,额外列必需要从表自己获取时(由于它们不是非汇集索引的一部分),书签查找会发生。若是你想避免书签查找,你能够在SQL Server里定义覆盖索引(Covering Index  。咱们来看下。post

覆盖索引(Covering Index)

在SQL Server里覆盖索引是传统的非汇集索引。惟一的区别是覆盖非汇集索引能够包含给出查询全部须要的列。这就是说使用覆盖索引能够避免书签查找。咱们来看一个很是简单的例子。下列的查询会产生书签查找,由于PostalCode列不是非汇集索引IX_Address_StateProvinceID 的一部分,在执行计划里,这个非汇集索引已被使用。性能

1 SELECT
2    AddressID,
3    PostalCode
4 FROM Person.Address
5 WHERE StateProvinceID = 42
6 GO

这个查询自己产生18个逻辑读。你能够经过定义覆盖非汇集索引,拿掉这个查询的书签查找。就是说,咱们须要包含PostalCode 列,在非汇集索引的叶子层。学习

1 CREATE NONCLUSTERED INDEX idxAddress_StateProvinceID ON
2 Person.Address (StateProvinceID)
3 INCLUDE (PostalCode)
4 GO

当你再次执行这个查询时,从执行计划里你能够看到书签查找已经不见了,SQL Server使用索引查找(非汇集索引)运算符。逻辑读减小为2个。很是显著的性能提高!url

惟一你要知道的是,并非每一个书签查找都是很是危险的。咱们的目标不是移除每一个书签查找,只有坏的才移除。spa

临界点(Tipping Point)

在一些状况下,当SQL Server对指定查询进行书签查找操做时,它能够决定书签查找太耗资源了(根据必须的逻辑读)。在那个状况下,SQL Server会进行全表扫描,而忽略全部的非合格列。作出这个决定点位置,在SQL Server里被称为临界点(Tipping Point)。临界点就是SQL Server用来决定是进行书签查找仍是全表扫描。code

临界点躲在你查询须要读取页数的1/4到1/4的某个位置。这和你须要读取的记录数无关(由于记录的大小决定了1页里你能够存放多少记录)。对于这个很是简单的例子,我定义的表里每条记录长度是400 bytes长,这就是在8k的页里能够存放20条记录。另外我在Value列定义了一个非汇集索引。下面的查询使用书签查找返回1061条记录。htm

1 SELECT * FROM Customers
2 WHERE Value < 1062
3 GO 

若是获取更多一条记录,做为特殊状况的下面查询就会临界点上,而后SQL Server就会扫描整个表。blog

1 SELECT * FROM Customers
2 WHERE Value < 1063
3 GO

2个近乎同样的查询,却有彻底不一样的执行计划!这在某些状况下会是个巨大的问题,由于你的计划稳定性再也不。过去几年我与不少不一样客户打交道时,由于这个问题,它们的SQL Server近乎发疯。SQL Server临界点游戏——为何非汇集索引被忽略!索引

小结

在这一部分的性能调优培训里,你学习了SQL Server里的覆盖非汇集索引还有临界点。在你学习的4个星期里,索引在SQL Server里能够说是个很神奇的东西!

每一个索引在提升你读性能的同时,也会下降你的写性能。在你执行INSERT, UPDATE和DELETE语句时, 每一个索引都由SQL Server全权负责维护。所以,你要基于读需求和写工做量来平衡你的索引策略。

接下来的4个星期,咱们会聚焦更多SQL Server里的执行计划,你会学到如何读懂和理解执行计划,还有它们如何用来作性能调优。请继续关注,下周见!

围观PPT:

0713_08_覆盖索引、临界点.rar

相关文章
相关标签/搜索