我想看看特定记录占用了多少 8K 页。
如果您在 AdventureWorks2019 上运行此查询:
SELECT ProductID
,Name
,DATALENGTH(Name) AS SizeInBytes
,LEN(Name) AS NumberOfCharacters
FROM Production.Product
ORDER BY 1
你有一个被每条记录占用的列表:
产品编号 | 姓名 | 大小字节 | 字符数 |
---|---|---|---|
1 | 可调种族 | 30 | 15 |
2 | 轴承球 | 24 | 12 |
3 | BB滚珠轴承 | 30 | 15 |
4 | 耳机滚珠轴承 | 42 | 21 |
316 | 刀 | 10 | 5 |
如何添加包含该记录所占用页数的列?
我当然可以,DATALENGTH(Name) / 8 AS PagesTaken
但我想知道是否有一些命令可以让我通过SELECT
.
我认为你在这里有一些倒退。一页为 8 KB(8,192 字节)。该表中的行具有所有列的数据类型大小总和的最大大小:
我实际上不会把所有这些都加起来,但让我们想象一下总和是 500 字节。
您可以通过浏览文档中的此页面来查找每种数据类型的大小,然后单击您想要查找大小信息的每种类型:数据类型 (Transact-SQL)
由于每个页面上的标题大小固定,以及其他每行开销,8KB 页面上的行可用空间量为 8,096(有关详细信息,请参见此处:页标题中存储了哪些其他信息)。
这意味着,在此表中,每页最多可以有 8096 / 500 = 16 行。
nvarchar
根据可变长度 ( ) 列的大小,可能可以容纳比这更多的行。您可以使用如下查询查看特定索引中有多少页:SQL Server:表和/或数据库使用的 8K 页数
从那里您可以得出每页获得的平均行数(表中的总行数/表中的总页数)。
您还可以使用
DBCC PAGE
(如上面的“页眉”链接中所述)查看有关每个页面的详细信息,包括页面上有多少行。请注意,以上所有内容都适用于“行内数据”。如果表具有 LOB 数据类型,那么如果它们的大小导致记录超过最大记录大小 8,060 字节,那么这些数据类型将存储在行外,可能存储在多个页面上。