我有一个表用户与一堆索引。其中之一是AccountIdentifier列上的唯一索引。这个sql查询为什么要做键查找?
由于这是一个唯一的索引,为什么除索引查找外还需要查找关键字?索引查找工具提示报告只返回一条记录。我也尝试将索引转换为“唯一键”类型。
alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png
我有一个表用户与一堆索引。其中之一是AccountIdentifier列上的唯一索引。这个sql查询为什么要做键查找?
由于这是一个唯一的索引,为什么除索引查找外还需要查找关键字?索引查找工具提示报告只返回一条记录。我也尝试将索引转换为“唯一键”类型。
alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png
因为它是选择*
。
它使用非聚集索引来定位行,但是需要去获取要返回的数据。
为了避免bookmark lookup你需要让非聚集索引覆盖索引(最好通过减少在选择列表中,但可能列数也通过添加新的列到索引本身或作为included columns)
如果表上有聚簇索引,则非聚簇索引中的行定位符将包含聚簇索引键,因此无需书签查找即可满足AccountIdentifier
和聚簇索引列上的查询。
我做了一些试验。所以它似乎选择了不在索引使用结果中的任何关键查找。这就说得通了。 – 2010-07-03 00:29:22
@BC - 基本上是的,但如果你有一个聚集索引,你可以考虑自动包含这些列。 – 2010-07-03 00:33:32
密钥查找并不意味着“查找密钥”,而是“查找基于密钥的行”。
请参阅以下文章和博客上的键查找/书签查找一些背景资料:
顺便说一句:永远不要在生产系统上做SELECT * - **绝不** - 没有例外。这是不好的做法,开始...... – 2010-07-03 07:03:37