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

时间:2014-09-30 04:04:54

标签: sql-server

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

例如

| id1 | id2 | id3 |名称

| NULL | NULL | NULL |詹姆斯邦德

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

修改

数据库服务器SQLServer2008 r2

提前致谢

2 个答案:

答案 0 :(得分:1)

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

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

回答你的问题,而不是深入研究所有这些细节,而忽略了对行压缩"行压缩的讨论。和"页面压缩" ...

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

问:这一行的内存大小是多少。

A:在你的情况下,有四列的表,记录头将有8个字节,固定长度列有一些固定的字节数,NULL位图有3个字节,以及可变长度列的可变存储量。

"行的内存大小"确实取决于列的数据类型,对于可变长度列,确定存储的值。

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

问:会将内存分配给具有空值的列吗?

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

SQL Server在"页面中管理内存" ...在估计内存需求方面,更相关的问题是"页面中有多少行适合"和&#34 ;存储我的行需要多少页?"

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

答案 1 :(得分:-1)

我在MSDN上找到了答案

使用稀疏列

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

http://msdn.microsoft.com/en-us/library/cc280604.aspx