据我所知,每个事务都会看到自己的数据库版本,因此系统无法从某个计数器获取总行数,因此需要扫描索引。但我认为这将是主键上的聚簇索引,而不是附加索引。如果我有一个以上的附加索引,那么将选择哪一个?
在深入研究此事时,我注意到了另一件奇怪的事情。假设有两个相同的表,Article和Articles2,每个表有三列:Id,View_Count和Title。第一个只有一个基于PK的聚簇索引,而第二个索引在view_count上有一个额外的非聚集,非唯一索引。对于具有附加索引的表,查询SELECT COUNT(1) FROM Articles
的运行速度提高了2倍。
答案 0 :(得分:9)
SQL Server将优化您的查询 - 如果需要计算表中的行,它将选择尽可能小的数据集。
因此,如果考虑您的聚簇索引 - 它包含实际的数据页 - 每行可能有几千个字节。要加载所有这些字节只是为了计算行将是浪费 - 即使只是在磁盘I / O方面。
因此,有一个非聚集索引没有以任何方式过滤或限制,SQL Server将选择该数据结构进行计数 - 因为非聚集索引基本上包含您放入NC索引的列(加上聚集索引键) - 加载的数据要少得多,只计算行数。