【SQL Server】统计表记录数

来源:互联网 发布:日语网络课程哪家好 编辑:程序博客网 时间:2024/06/05 10:56

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


0 0
原创粉丝点击