Mikael Eriksson 在下面很好地解释了为什么第一个查询很快:
SQL Server 将其优化为:if exists(select * from BookChapters)
。因此,它会查找是否存在一行,而不是计算表中的所有行。
对于另外两个查询,SQL Server 将使用以下规则。执行类似的查询SELECT COUNT(*)
,SQL Server将使用最窄的非聚集的索引来计算行数。如果表中没有任何
非聚集索引,则必须扫描表。
另外,如果您的桌子上有聚集的索引,您可以使用以下查询更快地获得计数(从此站点借用)快速获取行数! http://dbatipster.blogspot.com/2009/08/get-row-counts-fast.html)
--SQL Server 2005/2008/2016/2017/2019/2022
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc
它使用 sysindexes 系统表。您可以在这里找到更多信息SQL服务器 https://learn.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysindexes-transact-sql.
这是另一个链接为什么我的 SELECT COUNT(*) 运行这么慢? https://www.dcac.com/sql/why-is-my-select-count-running-so-slow/与另一种解决方案。它展示了当您右键单击表并选择属性时,Microsoft 使用快速显示行数的技术。
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
您应该发现,无论您有多少张桌子,它都会很快返回。
如果您使用的是 SQL 2000,则可以使用 sysindexes 表来获取该数字。
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
这个数字可能会略有偏差,具体取决于 SQL 更新 sysindexes 表的频率,但它通常是正确的(或至少足够接近)。