SQL 服务器在 table 中打包多个位字段
SQL Server packing multiple bit fields in a table
我正在使用 SQL Server 2016,但我认为这个问题应该适用于 SQL Server 的所有版本 ...
我了解到如果您在 table 中有多个位字段,那么这些字段会打包在一起以保存 space。 SQL 服务器是否会打包位字段,即使它们没有像这样连续出现?:-
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;DR; SQL 服务器将打包位字段,无论它们的定义顺序如何。
如果我们运行以下
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 字节的表中是相等的。
我正在使用 SQL Server 2016,但我认为这个问题应该适用于 SQL Server 的所有版本 ...
我了解到如果您在 table 中有多个位字段,那么这些字段会打包在一起以保存 space。 SQL 服务器是否会打包位字段,即使它们没有像这样连续出现?:-
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;DR; SQL 服务器将打包位字段,无论它们的定义顺序如何。
如果我们运行以下
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 字节的表中是相等的。