SQL Server 2008 R2中包含vs非包含的非聚簇索引

时间:2012-01-08 11:01:55

标签: sql-server sql-server-2008 indexing

运行顾问程序它建议我应该在PathValue上创建一个索引并包含Id

Path varchar(250)
Value bigint
Id uniqueidentifier
  1. 在查询中使用索引时,在索引中使用Id而不是包含它会更快吗?

  2. Id作为包含而不是在索引中插入会慢吗?

2 个答案:

答案 0 :(得分:2)

1)如果你对ID可以解决的ID进行操作(例如与它进行比较),那么将它放在索引中而不是只包含它可以使查询更快。

2)不,如果有的话,它可能会更快一点,并且可能导致索引中的碎片更少,而不是作为索引的一部分,因为服务器不必对包含的列进行排序以将它们放入索引存储。

如果所有必需的列都存储在索引数据中,则查询运行得最快。包含列只会这样:向索引添加更多数据而不实际索引它,因此不需要通过PK进行查找来获取数据。

答案 1 :(得分:1)

  • 1)取决于查询是否为

    select Id 
    from YourTable 
    WHERE Path = x and Value = y and Id =(or>, <, between etc.) z
    

即。 - 如果查询涉及Path和Value的精确值(不是范围) - 那么是,否则 - 否,因为非叶子行更厚而会慢一些

  • 2)实际上 - 是的,但它可以忽略不计,因为sql需要按Id排序 AND ,但如果你的Path和Value足够通用 - 差异将非常小。在 IO 中,如果在INCLUDE部分中保存ID,则会有一点收益 - 因为无需将其保存在非叶页上

你注意到了:

  

查询使用Id,Path和Value。加入限制和中的Id和路径   价值在哪里。 Id还是主表上的FK。有了这个   简短信息,您将如何设计索引?

因此,更好包含索引中的所有行,列的最佳顺序将取决于JOIN中其他表的结构/索引。

索引应该看起来像(Value, Id, Path)(Value, Path, Id) - 取决于上面提到的。

相关问题