牛骨文教育服务平台(让学习变的简单)
博文笔记

【SQL Server】统计表记录数

创建时间:2016-02-25 投稿人: 浏览次数:114

      说起统计表的记录数,第一印象就是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


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。