为什么在计算表中的所有行时是否存在非聚集索引扫描?

syn*_*pse 5 sql sql-server

据我所知,每个事务都会看到自己的数据库版本,因此系统无法从某个计数器获取总行数,因此需要扫描索引.但我认为它将是主键上的聚簇索引,而不是附加索引.如果我有一个以上的附加索引,那么将选择哪一个?

在深入研究此事时,我注意到了另一件奇怪的事情.假设有两个相同的表,Article和Articles2,每个表有三列:Id,View_Count和Title.第一个只有一个基于PK的聚簇索引,而第二个索引在view_count上有一个额外的非聚集,非唯一索引.SELECT COUNT(1) FROM Articles对于具有附加索引的表,查询运行速度提高了2倍.

mar*_*c_s 9

SQL Server将优化您的查询 - 如果需要计算表中的行,它将选择尽可能小的数据集.

因此,如果您考虑聚集索引 - 它包含实际数据页 - 每行可能有几千个字节.要加载所有这些字节只是为了计算行将是浪费 - 即使只是在磁盘I/O方面.

因此,有一个非聚集索引没有以任何方式过滤或限制,SQL Server将选择该数据结构进行计数 - 因为非聚集索引基本上包含您放入NC索引的列(加上聚集索引键) - 加载的数据少得多,只计算行数.