2010-07-03 55 views
15

我有一个表用户与一堆索引。其中之一是AccountIdentifier列上的唯一索引。这个sql查询为什么要做键查找?

由于这是一个唯一的索引,为什么除索引查找外还需要查找关键字?索引查找工具提示报告只返回一条记录。我也尝试将索引转换为“唯一键”类型。

alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png

+2

顺便说一句:永远不要在生产系统上做SELECT * - **绝不** - 没有例外。这是不好的做法,开始...... – 2010-07-03 07:03:37

回答

17

因为它是选择*

它使用非聚集索引来定位行,但是需要去获取要返回的数据。

为了避免bookmark lookup你需要让非聚集索引覆盖索引(最好通过减少在选择列表中,但可能列数也通过添加新的列到索引本身或作为included columns

如果表上有聚簇索引,则非聚簇索引中的行定位符将包含聚簇索引键,因此无需书签查找即可满足AccountIdentifier和聚簇索引列上的查询。

+1

我做了一些试验。所以它似乎选择了不在索引使用结果中的任何关键查找。这就说得通了。 – 2010-07-03 00:29:22

+1

@BC - 基本上是的,但如果你有一个聚集索引,你可以考虑自动包含这些列。 – 2010-07-03 00:33:32

13

密钥查找并不意味着“查找密钥”,而是“查找基于密钥的行”。