SQL Server:查询各表近24小时新增数据量及总数据量
解决方案:统计SQL Server各表近24小时新增数据量
当然有办法实现这个需求!不过首先得明确一个前提:你的每张业务表必须有一个记录数据插入时间的字段(比如CreateTime、InsertedAt这类)——因为SQL Server本身不会自动追踪每条数据的插入时间,没有这个字段的话,统计结果要么不准确,要么根本没法实现。
1. 单表查询示例
如果只需要查某一张表(比如你的表A)的近24小时新增量,直接用下面的语句就行:
SELECT COUNT(*) AS Last24hAddedCount FROM TableA WHERE InsertedAt >= DATEADD(HOUR, -24, GETDATE())
把InsertedAt换成你表中实际的插入时间字段名即可。
2. 批量查询所有表的新增量(含总数据量)
如果要一次性查询所有符合条件的表,同时展示总数据量(和你原来的查询结合),可以用动态SQL来遍历所有表:
DECLARE @SQL NVARCHAR(MAX) = '' -- 拼接每个表的查询语句 SELECT @SQL = @SQL + ' UNION ALL SELECT ''' + t.name + ''' AS TableName, -- 引用你原来的总数据量查询逻辑 (SELECT TOP 1 rows FROM sys.sysindexes WHERE id = t.object_id AND indid IN (0,1)) AS TotalCount, COUNT(*) AS Last24hAddedCount FROM ' + QUOTENAME(t.name) + ' WHERE InsertedAt >= DATEADD(HOUR, -24, GETDATE())' FROM sys.tables t -- 去掉开头多余的UNION ALL SET @SQL = STUFF(@SQL, 1, 10, '') -- 执行动态SQL EXEC sp_executesql @SQL
注意事项:
- 如果不同表的插入时间字段名不一样(比如有的是
CreateTime,有的是AddTime),你需要手动调整拼接逻辑,或者维护一个记录各表时间字段的映射表来适配。 - 给插入时间字段创建索引!不然大表的
COUNT(*)查询会非常慢,严重影响性能。
3. 没有插入时间字段的替代方案(仅估算)
如果你的表没有插入时间字段,只能用系统视图做估算,结果可能因为索引重建、统计信息更新等因素不准,仅供参考:
SELECT t.name AS TableName, (SELECT TOP 1 rows FROM sys.sysindexes WHERE id = t.object_id AND indid IN (0,1)) AS TotalCount, SUM(ps.row_count) - SUM(ps.prev_row_count) AS Last24hAddedEstimate FROM sys.tables t JOIN sys.dm_db_partition_stats ps ON t.object_id = ps.object_id WHERE ps.index_id IN (0,1) AND ps.last_updated >= DATEADD(HOUR, -24, GETDATE()) GROUP BY t.name
这个方案依赖分区统计的更新时间,只能大致估算新增量,不建议用于精准统计场景。
内容的提问来源于stack exchange,提问作者MiniDr




