SQL Server将多个位字段打包在表中

时间:2018-10-12 15:27:43

标签: sql-server bit ddl

我正在使用SQL Server 2016,但我认为该问题应适用于所有版本的SQL Server ...

我了解,如果表中有多个位字段,则这些字段会打包在一起以节省空间。即使位字段不连续出现,SQL Server也会打包位字段吗?:-

create table test (
    field1 int,
    field2 bit,
    field3 varchar(100),
    field4 bit,
    field5 varchar(100),
    field6 bit
)

还是我需要将所有位字段放在一起,就像这样:-

create table test (
    field1 int,
    field3 varchar(100),
    field5 varchar(100),
    field2 bit,
    field4 bit,
    field6 bit
)

1 个答案:

答案 0 :(得分:1)

TL;博士;无论位域的定义顺序如何,SQL Server 都会对其进行打包。

如果我们要运行以下内容

create table test_dispersed (
    field1 int,
    field2 bit,
    field3 varchar(100),
    field4 bit,
    field5 varchar(100),
    field6 bit
)

create table test_contiguous (
    field1 int,
    field3 varchar(100),
    field5 varchar(100),
    field2 bit,
    field4 bit,
    field6 bit
)

insert into test_dispersed (field1, field2, field3, field4, field5, field6) values (123,0,'A string',1,'Another string',0);
insert into test_contiguous (field1, field2, field3, field4, field5, field6) values (123,0,'A string',1,'Another string',0);


SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(N'YourDbName'), OBJECT_ID(N'[dbo].[test_dispersed]'), NULL, NULL , 'DETAILED')
SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(N'YourDbName'), OBJECT_ID(N'[dbo].[test_contiguous]'), NULL, NULL , 'DETAILED')

您会看到两个表的 [max_record_size_in_bytes, min_record_size_in_bytes, avg_record_size_in_bytes] 在 54 个字节的表中都是相同的和相等的。