我有一个查询,它将显示 SQL Server 中数据库表的表名、行数和记录大小。当我执行查询时,我得到的结果显示
TableName NumberOfRows SizeinKB
TBL_PROCESS_AUDIT2 1 16
但是当我使用相同的插入查询将更多记录插入同一个表并执行查询时,它显示更多行数 (50) 但大小相同 (16kb)。
TableName NumberOfRows SizeinKB
TBL_PROCESS_AUDIT2 50 16
实际上,当表的行数增加时,它的大小也应该增加。因此,对于 1 条记录,大小为 16KB,对于 50 条记录,大小应为 800KB。当我插入大约 2000 条记录之类的批量记录时,大小会发生变化。
我的查询中的逻辑或问题是什么?我想要数据库表记录的实际大小。
我的查询:
CREATE TABLE #RowCountsAndSizes (TableName NVARCHAR(128),rows CHAR(11),
reserved VARCHAR(18),data VARCHAR(18),index_size VARCHAR(18),
unused VARCHAR(18))
EXEC sp_MSForEachTable 'INSERT INTO #RowCountsAndSizes EXEC sp_spaceused ''?'' '
SELECT TableName,CONVERT(bigint,rows) AS NumberOfRows,
CONVERT(bigint,left(reserved,len(reserved)-3)) AS SizeinKB
FROM #RowCountsAndSizes
ORDER BY NumberOfRows DESC,SizeinKB DESC,TableName
DROP TABLE #RowCountsAndSizes
SQL Server 在 8kb 页上存储数据。您不能拥有小于两页的表格。所以当你向表中添加一行时,你的空间消耗最少为 2 * 8kb = 16kb。但是这些页面未满,这意味着再添加 15 行不会将表大小增加(15 * 初始大小),这只是意味着包含初始行的数据页有足够的空间容纳更多数据。如果您再添加 1000 行,我敢打赌您的大小会增加,但这会有所不同,具体取决于行中的内容以及 8kb 页面上可以容纳多少行。
我不知道如果您只想查看已使用页面上的空间而忽略未使用页面上的空间,那么表中有多少数据真的很重要。无论页面有 10 字节数据还是 7,997 字节,您都将占用 8 kb 的磁盘空间和 8 kb 的内存空间。所以你会看到大多数空间计算脚本只是占用
(number of pages) * 8,192
,因为页面上未使用的空间很少相关。