我在 SQL Server 2008 上运行此查询:
SELECT *
FROM Dealers WITH (INDEX(0))
WHERE ID = 'rrsdsd'
但是执行计划显示它使用了表的聚集索引。
为什么这样?
我在 SQL Server 2008 上运行此查询:
SELECT *
FROM Dealers WITH (INDEX(0))
WHERE ID = 'rrsdsd'
但是执行计划显示它使用了表的聚集索引。
为什么这样?
你告诉 SQL Server 是不使用任何索引来执行查询。因此,我希望查询计划显示正在使用的聚集索引(因为那是您的数据),但正在执行扫描而不是查找。是这样吗?
根据文档:
如果存在聚集索引,则 INDEX(0) 强制执行聚集索引扫描,INDEX(1) 强制执行聚集索引扫描或查找。
这正是您所看到的。
文档说明了一切......
索引 (index_value [,... n ] ) | INDEX = ( index_value) INDEX() 语法指定查询优化器在处理语句时要使用的一个或多个索引的名称或 ID。另一种 INDEX = 语法指定单个索引值。每个表只能指定一个索引提示。
如果存在聚集索引,则 INDEX(0) 强制执行聚集索引扫描,INDEX(1) 强制执行聚集索引扫描或查找。如果不存在聚集索引,则 INDEX(0) 强制执行表扫描,并且 INDEX(1) 被解释为错误。
如果在单个提示列表中使用多个索引,则忽略重复项,其余列出的索引用于检索表的行。索引提示中的索引顺序很重要。多索引提示还强制执行索引 ANDing,并且查询优化器对访问的每个索引应用尽可能多的条件。如果提示索引的集合不包括查询引用的所有列,则在 SQL Server 数据库引擎检索所有索引列之后执行提取以检索剩余列。