SQL Server :: 该记录占用了多少 8K 页?

Fra*_*ani 3 sql-server data-pages t-sql database-size size

我想查看特定记录占用了多少 8K 页。

如果您在 AdventureWorks2019 上运行此查询:

SELECT ProductID
    ,Name
    ,DATALENGTH(Name) AS SizeInBytes
    ,LEN(Name) AS NumberOfCharacters
FROM Production.Product
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

您可以得到每条记录的咬合列表:

产品ID 姓名 大小(以字节为单位) 字符数
1 可调式竞赛 30 15
2 轴承球 24 12
3 BB 球轴承 30 15
4 耳机滚珠轴承 42 21
316 刀刃 10 5

如何添加包含该记录所用页数的列?

我当然可以,DATALENGTH(Name) / 8 AS PagesTaken但我想知道是否有一些命令可以让我通过SELECT.

Jos*_*ell 12

我认为你这里有一些倒退的东西。一个页面为 8 KB(8,192 字节)。该表中的行的最大大小为所有列的数据类型大小之和:

AdventureWorks2019 数据库中 Production.Product 的创建表脚本的屏幕截图

我实际上并不打算将所有这些相加,但我们假设总和为 500 字节。

您可以通过浏览文档中的此页面并单击要查找其大小信息的每种类型来查找每种数据类型的大小:数据类型 (Transact-SQL)

由于每个页上的固定大小标头以及其他每行开销,8KB 页上的行可用空间量为 8,096(有关详细信息,请参阅此处:页标头中存储了哪些其他信息)。

这意味着,在此表中,每页最多可以有 8096 / 500 = 16 行。可能可以容纳比该数量稍多的行,具体取决于可变长度 ( nvarchar) 列的大小。

您可以使用如下查询查看特定索引中有多少页:SQL Server:表和/或数据库使用的 8K 页数

从那里您可以得出每页获得的行数的平均值(表中的总行数/表中的总页数)。

您还可以使用DBCC PAGE(如上面的“页面标题”链接中所述)查看有关每个页面的详细信息,包括页面上有多少行。


请注意,上述所有内容都适用于“行内数据”。如果表具有 LOB 数据类型,并且它们的大小导致记录超过 8,060 字节的最大记录大小,那么这些数据类型将存储在行外(可能存储在多个页上)。