我想知道数据库中的内存分配是否在列的DataType
的基础上分配内存,或者根据值分配。作为一个.net开发人员,我的概念是内存分配是基于DataType
而不是基于值来分配的。现在我有问题如何在数据库端处理内存分配。
例如
| NULL
| NULL
| NULL
|詹姆斯邦德
id1,id2,id3具有空值,该行的内存大小是多少。它会将内存分配给具有空值的列吗?
修改
数据库服务器SQLServer2008 r2
提前致谢
答案 0 :(得分:1)
SQL Server的物理存储位于一个名为" page"的单元中。页面中有几种结构,这些结构称为"记录"。有几种类型的记录,您似乎要问的记录类型称为"数据记录"。
(页面中还有其他几种类型的记录:索引记录,转发记录,虚假记录,文本记录和其他内部记录结构(分配位图,文件头等)
回答你的问题,而不是深入研究所有这些细节,而忽略了对行压缩"行压缩的讨论。和"页面压缩" ...
记录的一部分用于"固定长度"列,其中存储使用固定长度数据类型定义的列(整数,浮点数,日期,字符(n)等)。顾名思义,为每列保留固定数量的存储空间。记录的另一部分是"可变长度"部分,其中存储可变长度数据类型的列,排列为数组,可变长度列数的双字节计数,以及每列,到列值末尾的两个字节的偏移量。
问:这一行的内存大小是多少。
A:在你的情况下,有四列的表,记录头将有8个字节,固定长度列有一些固定的字节数,NULL位图有3个字节,以及可变长度列的可变存储量。
"行的内存大小"确实取决于列的数据类型,对于可变长度列,确定存储的值。
(如果存在任何索引,索引记录中也需要空间。)
问:会将内存分配给具有空值的列吗?
如果列是固定长度,是的。如果列是可变长度,则是,至少,两个字节偏移到值的末尾,即使该值为零长度。
SQL Server在"页面中管理内存" ...在估计内存需求方面,更相关的问题是"页面中有多少行适合"和&#34 ;存储我的行需要多少页?"
包含一个数据记录的页面需要4KB内存。包含十几个数据记录的页面需要4KB内存。
答案 1 :(得分:-1)
我在MSDN上找到了答案
使用稀疏列
SQL Server数据库引擎在列定义中使用SPARSE关键字来优化该列中值的存储。因此,当表中任何行的列值为NULL时,这些值不需要存储。