找出SQL Server数据库中存储的总行数的简便方法是什么?

时间:2010-02-08 13:54:57

标签: sql sql-server sql-server-2005 sql-server-2008

我正在寻找一种简单的方法来计算一个SQL Server 2005/2008数据库中的所有行(当然跳过系统表)?我知道我可以使用

SELECT COUNT (COLUMN) FROM TABLE

并为每个表执行此操作,然后将其添加,但更喜欢某种自动方式?

有吗?

7 个答案:

答案 0 :(得分:3)

SELECT SUM(row_count)
    FROM sys.dm_db_partition_stats
    WHERE index_id IN (0,1)
    AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0;

这可能是准确的,除了可能是您在运行查询时在事务中添加或删除的任何行。它不会有牺牲单个表的费用。

但正如我在另一条评论中所提到的,我不确定这有助于您确定数据库保存的“数据量”。多少行,当然,但如果我有10个眼镜,每个半满水,你有5个眼镜,每个都完全满了,我们哪个人有更多的水?

答案 1 :(得分:2)

尝试:

SELECT 
    [TableName] = so.name, 
    [RowCount] = MAX(si.rows) 
FROM 
    sysobjects AS so, 
    sysindexes AS si 
WHERE 
    so.xtype = 'U' 
    AND 
    si.id = OBJECT_ID(so.name) 
GROUP BY 
    so.name 
ORDER BY 
    2 DESC

这是索引行。这可能只是一个近似值,因为数据库变化很大,有些东西可能没有被索引,但这会很快。

编辑:请注意,so.xtype是用户类型,假设您不需要系统内容,只需要“真实”数据。

EDIT2:没有火焰注意:在sysobjects表上查询可能是一个坏主意:)。

EDIT3:专门针对需求,没有关联联接:)

SELECT sum(mycount) from
(SELECT 
    MAX(si.rows) AS mycount
FROM 
    sysobjects AS so 
    join sysindexes AS si  on si.id = OBJECT_ID(so.name) 

WHERE 
    so.xtype = 'U' 
GROUP BY 
  so.name 
) as mylist

答案 2 :(得分:2)

这是我今天对类似问题的回答:

SQL Server 2005或更高版本提供了一个非常有用的报告,显示了表格大小 - 包括行数等。它在标准报告中 - 它是按表格的光盘使用情况。

以编程方式,有一个很好的解决方案:http://www.sqlservercentral.com/articles/T-SQL/67624/

答案 3 :(得分:1)

我们知道sp_spaceused,当传递一个表名时,会返回一个行计数,因此我们可以检查它的作用 - 它会查询sys.dm_db_partition_stats - 并复制它以获得这个:

SELECT
    SUM(ddps.row_count) TotalRows
FROM
    sys.indexes i
    INNER JOIN sys.objects o ON i.OBJECT_ID = o.OBJECT_ID
    INNER JOIN sys.dm_db_partition_stats ddps ON 
        o.OBJECT_ID = ddps.OBJECT_ID
        AND i.index_id = ddps.index_id
WHERE
    i.index_id < 2
    AND o.is_ms_shipped = 0 -- to exclude system tables

虽然有好奇的要求,但我必须说......

答案 4 :(得分:0)

您可以查询sysindexes,查看每个表上聚簇索引的rowcnt值。但我不确定到底是怎么回事。

或者,像这样(在一个小测试数据库上进行简要测试):

CREATE TABLE #TableRowCount (TableName NVARCHAR(128), RowCnt BIGINT)
INSERT #TableRowCount (TableName, RowCnt) 
EXECUTE sp_msforeachtable 'SELECT "?", COUNT(*) FROM ?'
SELECT SUM(RowCnt) AS TotalRowCount FROM #TableRowCount
DROP TABLE #TableRowCount

答案 5 :(得分:0)

我不确定旧版本的MS SQL是否具有data_shema数据字典的SQL标准。

您可以执行以下操作:

SELECT SUM(table_rows)
FROM  information_schema.tables
WHERE table_schema = 'DATABASENAME'

答案 6 :(得分:0)

查看未记录的存储过程sp_MSForEachTable。使用它,您可以在数据库中的每个表上运行Count(*)。针对您的具体问题:

EXEC sp_MSforeachtable 'SELECT ''?'', Count(*) as NumberOfRows FROM ?'