SELECT COUNT(*)查询是否必须进行全表扫描?

时间:2019-02-28 08:48:45

标签: sql-server database sql-server-2014

获取表中所有行数的查询是否必须进行全表扫描,或者SQL Server是否在某处维护行数?

SELECT COUNT(*) FROM TABLE_NAME;

TABLE_NAME具有主键,因此具有聚集索引,其外观如下:

CREATE TABLE TABLE_NAME
(
  Id int PRIMARY KEY IDENTITY(1, 1),
  Name nvarchar(50) NOT NULL
);

我正在使用Microsoft SQL Server 2014。

4 个答案:

答案 0 :(得分:5)

服务器将始终读取所有记录(如果有索引,则它将扫描整个索引)以对行进行计数。只要您正在做$xpath ->query('//div[@class="datatable"]/table//tbody/tr[' . $i . ']/td[' . $j . ']/text()'); ,就无法逃避这一点。

如果您的表具有聚集索引,则可以change your query到“幕后”查询来检索计数,而无需实际使用以下方法获取记录:

SELECT COUNT(*) FROM Table

如果您要查找记录的 近似 条记录,还可以使用以下查询:

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

这将以相对较快的速度显示非系统表,这些表具有计算出的(不精确的)行数和数据大小的总和(具有可能具有的任何索引),而无需检索记录。

答案 1 :(得分:4)

当SQL Server执行类似SELECT COUNT(*)的查询时,SQL Server将使用最窄的non-clustered index来对行进行计数。如果该表没有任何non-clustered index,则必须扫描该表。

如果表中有clustered index,则可以使计数更快。

答案 2 :(得分:0)

SELECT COUNT(*) FROM TABLE_NAME;

进行全表扫描。

有关优化的信息,请参见this

答案 3 :(得分:0)

您可以按照以下方式进行。我想它的性能会更好。

SELECT COUNT(1) FROM TABLE_NAME