SQL Server索引覆盖的实际应用代码描述

数据库 SQL Server
此文章主要向大家描述的是SQL Server索引覆盖(Index Covering),以及对其在实际操作中值得我们大家注意的实际应用代码的描述。

以下的文章主要向大家讲述的是SQL Server索引覆盖(Index Covering),SQL Server数据库索引覆盖主要是这种情况,查询中的select 与where子句中所需要的信息都能在非聚集索引中找到。

因为非聚集索引包含了一个对应于表中每个数据行的一个叶子行,SQL Server能从非聚集索引的叶子行来满足查询。这导致了数据检索的更快,因为所有的信息能从索引页中直接获得,并且避免了SQL Server查找数据页。

因为非聚集索引的叶子页都连接在一起,索引的叶级可以像表中的数据页一样进行扫描,因为页级行都典型比数据行要小,一个覆盖了查询的非聚集索引将比同样列的聚集索引更快,因为需要读取的页数要更少。

在下面的例子中,quthors表中的关于au_lname 和au_fname的非聚集索引将覆盖查询,因为结果中的列和SARG都能从索引中提取出来:

  1. Sql代码   
  2. Select au_lname, au_fname   
  3. From authors   
  4. Where au_lname like "M%"   
  5. GO   
  6. Select au_lname, au_fname  
  7. From authors  
  8. Where au_lname like "M%"  
  9. GO  

其他使用聚合函数(MIN AVG SUM COUNT)的查询或者仅仅检查是否存在的查询也能从SQL Server索引覆盖中获益。下面是一些能够利用索引覆盖优点的查询:

  1. Sql代码   
  2. Select count (au_lname) from authors where au_lname like 'm%'   
  3. Select count (*) from authors where au_lname like 'm%'   
  4. Select count (*) from authors   
  5. Select count (au_lname) from authors where au_lname like 'm%'  
  6. Select count (*) from authors where au_lname like 'm%'  
  7. Select count (*) from authors  

 

你可能会奇怪最后一个查询,它甚至没有一个具体的SARG,怎么还能使用索引。SQL Server知道非聚集索引的特性,一个非聚集索引为表中的每行数据都包含了一行;它能够简单的计算任何一个非聚集索引的行数,而不需要扫描整个表。对最后一个查询,SQL Server选择最小的非聚集索引——也就是,具有最少的叶子页的索引。

 

向非聚集索引添加列使得发生SQL Server索引覆盖是一种提高查询响应时间的常见方法。考虑下面的查询:

  1. Sql代码   
  2. Select royalty from titles   
  3. Where price between $10 and $ 20   
  4. Select royalty from titles  
  5. Where price between $10 and $ 20  

 

如果你仅在price列上创建索引,SQL Server能发现满足price在该范围的索引中的行,但是它还需要访问数据行来检索royalty。范围中有100行,最坏情况下检索数据所花费的IO代价计算如下:

 

 

引用

 

索引的级数

 

+查找匹配行的索引页的数

 

+100 * 每个书签查找页数

 

如果royalty列添加到了price列索引中了,索引能被扫描来检索结果,而不是进行书签查找,这样具有更快的查询响应。使用SQL Server索引覆盖的IO代价将只是:

引用

索引级数

 

+查找匹配行的索引页的数

 

 

引用

 

注意:

 

当考虑添加索引来利用索引覆盖时,小心使得索引变得太宽。当索引行的宽度接近与数据行宽度时,覆盖的优点将失去,因为增加了叶级页的数目。当索引的叶级页的数目接近了表中页的数目,索引级数也增加了,那么索引扫描的时间就开始接近于表扫描时间了。

 

另外,如果你添加对到索引中的列频繁修改,数据行中列的任何修改也会波及到索引中。这增加了维护的负担,也会影响修改的性能。

 

 

正如第33章讨论的那样,当在一个表上创建了 一个聚集索引,聚集键会被所有的非聚集索引引用,作为书签来定位实际的数据行。聚集键实际就是一些列,它们构成了聚集索引和它们的数据值。这种特性有时也能导致SQL Server索引覆盖。

 

例如,假设suthors表在au_lname au_fname列上建立聚集索引,并有一个定义在au_id的非聚集索引。非聚集索引的每行都包含了与数据行对应的au_lname au_fname聚集键值。因为这个原因,下面查询将被非聚集索引覆盖:

 

 

  1. Sql代码   
  2. select au_lname, au_fname   
  3. from authors   
  4. where au_id like '123%'  

以上的相关内容就是对SQL Server索引覆盖(Index Covering)的介绍,望你能有所收获。

【编辑推荐】

  1. SQL Server创建约束的代码运用
  2. SQL Server创建表所要用到的代码
  3. 优化SQL Server数据库的经验大盘点
  4. SQL Server 2005商业智能功能浅析
  5. 修改SQL Server 2005 数据库的执行环境很简单
责任编辑:佚名 来源: csdn.net
相关推荐

2010-07-07 10:54:22

SQL Server索

2010-07-07 09:27:15

SQL Server索

2010-07-08 16:44:21

SQL Server索

2010-06-18 10:56:40

SQL server合

2010-06-17 10:02:12

SQL Server数

2010-07-05 08:31:25

SQL Server快

2010-07-07 11:03:21

SQL Server索

2010-07-07 09:47:04

SQL Server索

2010-07-19 16:17:41

SQL Server聚

2010-07-05 12:21:57

SQL Server记

2010-07-06 09:20:30

SQL Server查

2010-07-12 17:06:30

SQL Server

2010-06-28 13:56:16

SQL Server代

2010-06-28 13:27:33

SQL Server视

2010-05-12 09:42:24

MySQL 列值比较

2011-03-30 11:28:31

SQL Server聚集索引

2010-05-31 13:57:49

2010-05-10 13:33:11

Oracle存储过程

2010-06-17 12:26:51

SQL Server索

2010-07-05 14:20:29

点赞
收藏

51CTO技术栈公众号