Sql server 主键(ID)上的索引扫描

Sql server 主键(ID)上的索引扫描,sql-server,query-optimization,Sql Server,Query Optimization,质疑 为什么即使查询基于主键(ID),optimizer也会使用索引扫描?如果阅读计划的“索引扫描”节点中的详细信息,您会发现它只需要返回一行。事实上,从末尾扫描一行比索引查找具有更好的性能 MSSQL索引的物理结构是B+树。通过索引查找,这意味着您从树部分开始查找O(logn)中的项。通过索引扫描,意味着您从数据部分开始查找项目。这次你读了一个,所以是O(1) 因此,您的查询现在实际上执行得非常快。将您的计划xml上载到,并将链接添加到您的问题,而不是作为图像链接。您希望哪种计划更为优化?只

质疑


为什么即使查询基于主键(ID),optimizer也会使用索引扫描?

如果阅读计划的“索引扫描”节点中的详细信息,您会发现它只需要返回一行。事实上,从末尾扫描一行比索引查找具有更好的性能

MSSQL索引的物理结构是B+树。通过索引查找,这意味着您从树部分开始查找O(logn)中的项。通过索引扫描,意味着您从数据部分开始查找项目。这次你读了一个,所以是O(1)


因此,您的查询现在实际上执行得非常快。

将您的计划xml上载到,并将链接添加到您的问题,而不是作为图像链接。您希望哪种计划更为优化?只读取第一行,向后读取索引。我希望索引查找而不是索引扫描查找的值是多少?查询中没有WHERE子句。检查聚集索引扫描操作符,您将看到它是有序向后扫描。顶部运算符请求一行。因此,返回的值将是表中的最大值,并以最佳方式检索。因此,基本上,如果查询中需要搜索特定的id值,则使用index seek
SELECT MAX(ID) FROM Product