获取表中所有行数的查询是否必须进行全表扫描,或者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。
答案 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)
答案 3 :(得分:0)
您可以按照以下方式进行。我想它的性能会更好。
SELECT COUNT(1) FROM TABLE_NAME