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

Sql server SQL Server在表中打包多个位字段,sql-server,bit,ddl,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

我正在使用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
)

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')


您将看到,对于这两个表,
[最大记录大小(以字节为单位)、最小记录大小(以字节为单位)、平均记录大小(以字节为单位)]
在54字节的表中都是相同和相等的。

通过“打包在一起”,我假定您指的是数据在后台的存储方式。SQL Server将数据存储在8K页中。如果它可以将所有数据放在一个页面中,那么它就会这样做,否则数据将分布在多个页面上。您的架构定义不会对此产生任何影响。Microsoft的文档说明“SQL Server数据库引擎优化位列的存储。如果表中的位列不超过8,则列将存储为1字节。”。但是位字段是否需要在表中相邻?对但我的观点是,SQLServer确实是在后台实现的。你的DDL不会影响它。字段的定义顺序无关紧要。