说起统计表的记录数,第一印象就是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_dateFROM Tempdb.sys.tables TJOIN Tempdb.sys.partitions PON T.object_id = P.object_idWHERE 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 FileGroupFROM sys.tables tJOIN sys.schemas s ON s.schema_id = t.schema_idJOIN sys.indexes i ON t.OBJECT_ID = i.object_idJOIN sys.partitions pON i.object_id = p.OBJECT_ID AND i.index_id = p.index_idJOIN sys.allocation_units a ON p.partition_id = a.container_idWHERE t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 AND i.index_id < 2 GROUP BY t.Name, s.NameORDER BY TotalSpaceKB desc