我有一个 Microsoft SQL Server 2008 表,其中有一个很少使用的 Varchar(max) 字段。将该字段移动到另一个表并指向该表是否更有意义?
或者如果 Varchar(max) 字段包含 null,它不会占用大量空间吗?
我有一个 Microsoft SQL Server 2008 表,其中有一个很少使用的 Varchar(max) 字段。将该字段移动到另一个表并指向该表是否更有意义?
或者如果 Varchar(max) 字段包含 null,它不会占用大量空间吗?
否。SQL Server 已经为 BLOB 类型使用了单独的分配单元,请参阅表和索引组织。NULL 值在一行中只占用一位,请参阅记录剖析。
通过创建单独的表会浪费更多空间,并且检查列是否为 NULL 或具有值的成本要高得多。此外,列值可以针对较小的值进行优化和拉入行内,如果它们适合,提供显着更快的访问。总的来说,不要试图对引擎已经在推动极限的东西进行微优化,以使其尽可能高效......
如果表是稀疏的(这意味着它有许多(数百、数千)列,其中每行中有许多为 NULL),那么您可以使用sparse columns。
来自http://msdn.microsoft.com/en-us/library/aa224016(v=sql.80).aspx:
varchar 数据类型是可变长度数据类型。小于列大小的值不会右填充到列大小
varchar 仅包含长度 + 内容。
可空字段使用额外的位来存储空/非空状态,因此记录本身不会占用额外空间。