一尘不染

是否为COUNT(*)建立索引?

sql

我只是出于好奇而想知道,是否Select Count(*) from SomeTableName也遍历数据库的所有行Select * from SomeTableName

还是在数据库的元数据中有其他计数字段可用于在每次添加或删除行时进行更新?以前的查询将访问该字段。

我也想知道两个查询中哪个查询更快,多少查询?


阅读 167

收藏
2021-03-17

共1个答案

一尘不染

SELECT Count(*)
FROM SomeTableName

将始终计算所有行。尽管(不同于SELECT *),它不必读取所有列,并且可以使用可用的最窄(未过滤)索引。

与MySQL(MyISAM引擎)不同,它不会从元数据中检索值。

行计数值在元数据中可用,并且可以从中检索,sys.partitions但是它从未用于COUNT查询,而且并不总是准确的。

2021-03-17