我正在寻找一种简单的方法来计算一个SQL Server 2005/2008数据库中的所有行(当然跳过系统表)?我知道我可以使用
SELECT COUNT (COLUMN) FROM TABLE
并为每个表执行此操作,然后将其添加,但更喜欢某种自动方式?
有吗?
答案 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 ?'