Sql server 如何将内存分配给数据库中的每个属性

Sql server 如何将内存分配给数据库中的每个属性,sql-server,Sql Server,我想知道数据库中的内存分配是基于列的DataType分配内存,还是根据值分配内存。作为一名.net开发人员,我的概念是,内存分配是基于数据类型而不是基于值来分配的。现在我有一个问题,内存分配是如何在数据库端处理的 比如说 |id1 | id2 | id3 |名称 |NULL|NULL|NULL|詹姆斯·邦德 id1、id2、id3有空值,此行的内存大小是多少。它会将内存分配给具有空值的列吗 编辑 数据库服务器SQLServer2008 r2 提前感谢SQL Server的物理存储位于一个称为“页

我想知道数据库中的内存分配是基于列的
DataType
分配内存,还是根据值分配内存。作为一名.net开发人员,我的概念是,内存分配是基于
数据类型而不是基于值来分配的。现在我有一个问题,内存分配是如何在数据库端处理的

比如说

|id1 | id2 | id3 |名称 |
NULL
|
NULL
|
NULL
|詹姆斯·邦德

id1、id2、id3有空值,此行的内存大小是多少。它会将内存分配给具有空值的列吗

编辑

数据库服务器SQLServer2008 r2


提前感谢

SQL Server的物理存储位于一个称为“页面”的单元中。页面中有几个结构,这些结构称为“记录”。有几种类型的记录,您似乎询问的记录类型称为“数据记录”

(页面中还有其他几种类型的记录:索引记录、转发记录、重影记录、文本记录和其他内部记录结构(分配位图、文件头等)

为了回答您的问题,不要深入研究所有这些细节,也不要忽略对“行压缩”和“页面压缩”的讨论

记录的一部分用于“固定长度”列,其中存储使用固定长度数据类型定义的列(整数、浮点、日期、字符(n)等)。顾名思义,为每列保留固定的存储量。记录的另一部分是“可变长度”部分,其中存储具有可变长度数据类型的列,排列为一个数组,可变长度列数的两字节计数,以及每列到列值末尾的两字节偏移量

Q:此行的内存大小是多少。

A:在您的情况下,对于包含四列的表,记录头将有八个字节,固定长度列将有一些固定数量的字节,空位图将有三个字节,可变长度列的存储量将可变

“行的内存大小”实际上是由列的数据类型决定的,对于可变长度的列,是由存储的值决定的

(如果存在任何索引,索引记录中也需要空间。)

Q:它会将内存分配给具有空值的列吗

如果列的长度是固定的,则为“是”。如果列的长度是可变的,则为“是”,即使值的长度为零,也至少为值末尾的两个字节偏移量

SQL Server在“页面”中管理内存……在估计内存需求方面,更相关的问题是“一个页面中可以容纳多少行”和“需要多少页来存储我的行?”


包含一条数据记录的页面需要4KB内存。包含十几条数据记录的页面需要4KB内存。

我在MSDN上找到了答案

使用稀疏列

SQL Server数据库引擎在列定义中使用SPARSE关键字来优化该列中值的存储。因此,当表中任何行的列值为NULL时,这些值不需要存储


我读了这篇文章,内容非常丰富,但我的问题不清楚。我在文章中指出了一点:“由于固定长度的数据列总是占用分配的空间,我们需要空位图来知道值是否为空”当null被分配到固定的列大小时,它分配给它内存我可以通过sql命令检查表中每个插入行的内存吗?斯宾塞谢谢你的时间。每个记录页都有8kb,不管其中的数据是什么。如果id1有null值,id2有值,如果它将内存分配给id1,实际上没有数据。我可以检查吗从表中每个插入行的命令可以得到多少内存?