【SQL Server】统计表记录数

SQL Server 专栏收录该内容
5 篇文章 0 订阅

      说起统计表的记录数,第一印象就是count(*), 弊端这里就不多说了,这里将为大家介绍一些常用的查询表记录数的系统视图。

      首先,介绍系统存储过程sp_spaceused, 返回结果包括行数、保留的磁盘空间以及当前数据库中的表、索引视图或 Service Broker 队列所使用的磁盘空间,或由整个数据库保留和使用的磁盘空间。使用起来很简单,直接加需要统计的表名即刻。

EXEC sp_spaceused 'Table_Name';

除了表的记录数,以上语句会返回很多空间相关的信息(这里暂不做介绍)。为了只获取返回的记录数信息,查看了sp_spaceused的源码(喜欢作啊~~),从中抽取了只用于统计记录数的相关表/视图。

方法一 , 使用系统视图sys.dm_db_partition_stats查询记录数。

SELECT sum(row_count) as ROW_COUNT FROM sys.dm_db_partition_stats WITH (NOLOCK) WHERE index_id < 2 and object_id = OBJECT_ID('Table_Name')

方法二 ,使用系统视图sys.partitions查询记录数。

SELECT sum(rows) as ROW_COUNT from sys.partitions WITH (NOLOCK) where index_id < 2 and object_id = OBJECT_ID('Table_Name')

方法三 ,使用来自SQL Server 2000的系统视图sysindexes,不知道在2000版本中表现如何,在后续的SQL Server版本中sysindexes查询记录数或者查询上次更新统计信息后变化的记录数,都会偶尔出现不准确的情况,所以不建议使用。

SELECT rowcnt FROM sysindexes WITH (NOLOCK) WHERE indid IN (0,1) and id = OBJECT_ID('Table_Name')

      衍生开来,有时候需要统计数据库中所有的表分别的记录数,此时继续使用以上系统视图。

方法一 :

SELECT OBJECT_NAME(object_id) as Table_Name, sum(row_count) as ROW_COUNT FROM sys.dm_db_partition_stats WITH (NOLOCK) WHERE index_id < 2 group by object_id order by ROW_COUNT desc

方法二 :

SELECT OBJECT_NAME(object_id) as Table_Name, sum(rows) as ROW_COUNT from sys.partitions WITH (NOLOCK) where index_id < 2 group by object_id order by ROW_COUNT desc

方法三:

SELECT OBJECT_name(id) as Table_Name, rowcnt from sysindexes WITH (NOLOCK) where indid in(0,1) order by rowcnt desc

      那么,temp表的记录数能不能查呢,答案是必须可以啊

SELECT T.name,
       P.rows,
       T.create_date,
       T.modify_date
FROM Tempdb.sys.tables T
JOIN Tempdb.sys.partitions P
  ON T.object_id = P.object_id
WHERE T.name LIKE N'#tmp%'
ORDER BY T.create_date DESC

     最后,再给出一个SQL用于统计数据库中所有表的记录数,分配的总空间,已使用/未使用空间以及数据页使用的空间大小。通常在遇到空间不足的问题时,我会使用该SQL统计DB中所有表及其空间使用情况,以便做进一步的清理操作,释放存储空间。注意,清理数据只会释放数据页使用的空间,并不会直接释放磁盘空间(已分配空间不会减少),只有shrink后才会释放相应的磁盘空间。

SELECT s.Name AS SchemaName,
       t.NAME AS TableName,
       SUM(p.rows)/COUNT(distinct a.type) AS RowCounts,
       CAST(SUM(a.total_pages) as float) * 8 AS TotalSpaceKB, 
       SUM(a.used_pages) * 8 AS UsedSpaceKB, 
       SUM(a.data_pages) * 8 AS DataSpaceKB,
       CAST((SUM(a.total_pages) - SUM(a.used_pages)) as float)  * 8 AS UnusedSpaceKB,
       MIN(FILEGROUP_NAME(a.data_space_id)) as FileGroup
FROM sys.tables t
JOIN sys.schemas s 
  ON s.schema_id = t.schema_id
JOIN sys.indexes i 
  ON t.OBJECT_ID = i.object_id
JOIN sys.partitions p
  ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
JOIN sys.allocation_units a 
  ON p.partition_id = a.container_id
WHERE t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 AND i.index_id < 2 
GROUP BY t.Name, s.Name
ORDER BY TotalSpaceKB desc


  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Kingsley_W

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值