SQL 计算表中的行数
Posted
技术标签:
【中文标题】SQL 计算表中的行数【英文标题】:SQL count rows in a table 【发布时间】:2015-05-09 03:04:45 【问题描述】:我需要向数据库发送一个 SQL 查询,告诉我一个表中有多少行。我可以使用 SELECT 获取表中的所有行,然后计算它们,但我不喜欢这样做。有没有其他方法可以向 SQL 服务器询问表中的行数?
【问题讨论】:
这能回答你的问题吗? Fastest way to count exact number of rows in a very large table? 【参考方案1】:是的,SELECT COUNT(*) FROM TableName
【讨论】:
选择每一列而不是单列不是计算量更大、效率更低吗??? 不,优化器足够聪明,可以识别这种情况并生成正确的执行计划。查一下,关于 SO 的问题有很多。 我有很多事情要做,因此很遗憾现在没有时间阅读它。但是,这将列在要做的事情列表中 这不是最好的答案,因为它会给生产系统带来不必要的锁和压力,尤其是对于大型表。使用 sys.partitions 直接从表元数据中返回确切的行数! 这对我来说失败了,因为我出于对聚合函数的习惯,加入了“GROUP BY”语句 - 不要那样做!【参考方案2】:select sum([rows])
from sys.partitions
where object_id=object_id('tablename')
and index_id in (0,1)
非常快,但很少不准确。
【讨论】:
我在一个有 400+ 百万行的表上运行了这个。超级快。 非常快 - 不到一秒,超过 17 亿行。谢谢! 这比 select count(*) from table 慢 这是一个元操作(这意味着它读取单个(或只是描述分区的所有行的总和,通常是 1 个条目),因此它几乎总是比读取 a 的每一行更快表。 这应该是最好的答案。我在几张不同大小的表上进行了基准标记,发现使用元数据查询与使用SELECT(*)
一样快或明显快。【参考方案3】:
使用这个查询:
Select
S.name + '.' + T.name As TableName ,
SUM( P.rows ) As RowCont
From sys.tables As T
Inner Join sys.partitions As P On ( P.OBJECT_ID = T.OBJECT_ID )
Inner Join sys.schemas As S On ( T.schema_id = S.schema_id )
Where
( T.is_ms_shipped = 0 )
AND
( P.index_id IN (1,0) )
And
( T.type = 'U' )
Group By S.name , T.name
Order By SUM( P.rows ) Desc
【讨论】:
【参考方案4】:这里是查询
select count(*) from tablename
或
select count(rownum) from studennt
【讨论】:
【参考方案5】:你为什么不右击表格然后属性 -> 存储,它会告诉你行数。 您可以将以下内容用于视图中的行数。在 WHERE 子句中使用表的名称。
SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('TableName')
AND (index_id=0 or index_id=1)`
【讨论】:
benjamin 的回答中使用的“sys.dm_db_partition_stats”和“sys.partitions”有什么区别?【参考方案6】:索引统计信息可能需要是最新的,但这将返回所有非 MS_SHIPPED 表的行数。
select o.name, i.rowcnt
from sys.objects o join sys.sysindexes i
on o.object_id = i.id
where o.is_ms_shipped = 0
and i.rowcnt > 0
order by o.name
【讨论】:
以上是关于SQL 计算表中的行数的主要内容,如果未能解决你的问题,请参考以下文章