22,210
社区成员
发帖
与我相关
我的任务
分享
-- 创建2个测试表
CREATE TABLE [dbo].[Table_2019]([Data] [nchar](2019) NOT NULL)
CREATE TABLE [dbo].[Table_2020]([Data] [nchar](2020) NOT NULL)
go
-- 填充数据
declare @i int
set @i = 0
while(@i < 20)
begin
insert Table_2019(Data) values('')
insert Table_2020(Data) values('')
select @i = @i + 1
end
go
-- 创建2个测试表
CREATE TABLE [dbo].[Table_2019]([Data] [nchar](2019) NOT NULL)
CREATE TABLE [dbo].[Table_2020]([Data] [nchar](2020) NOT NULL)
go
-- 填充数据
declare @i int
set @i = 0
while(@i < 20)
begin
insert Table_2019(Data) values('')
insert Table_2020(Data) values('')
select @i = @i + 1
end
go
exec sp_spaceused 'Table_2019'
exec sp_spaceused 'Table_2020'
--结果:
Table_2019 20 144 KB 80 KB 16 KB 48 KB
Table_2020 20 200 KB 160 KB 8 KB 32 KB
--由此可看出数据空间差异
dbcc extentinfo(test,Table_2019)
dbcc extentinfo(test,Table_2020)
--结果:
4 2691 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
4 2698 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
4 2695 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
4 2703 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
1 65186 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
1 65187 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
1 65188 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
1 65189 1 1 212481573 0 1 72057594044940288 In-row data 0x6400000000000000
1 65200 2 8 212481573 0 1 72057594044940288 In-row data 0x4444000000000000
4 2692 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
4 2693 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
4 2694 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
4 2699 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
4 2700 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
4 2701 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
1 65184 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
1 65185 1 1 228481630 0 1 72057594045005824 In-row data 0x6200000000000000
4 2712 8 8 228481630 0 1 72057594045005824 In-row data 0x4242424242424242
4 2720 4 8 228481630 0 1 72057594045005824 In-row data 0x4242424200000000
--由此可得出分配的页面数,第一个表分配了10个页面,第二个表分配了20个
结论:第一个表每列的长度4045字节,加上页头96字节,和页尾的每行2字节的偏移量,一个页面可以容纳2行记录的
即96+4045+4045+4
而第二个表则只能每页一行记录
至于为何有单一区的分配要看SGAM和GAM与FPS的协同工作机制
DECLARE
@Num_Cols int, -- 总列数(固定长度和可变长度)
@Fixed_Data_Size int, --= 所有固定长度列的总字节大小
@Num_Variable_Cols int, -- = 可变长度列的数量
@Max_Var_Size int --= 所有可变长度列的最大总字节大小
SELECT
@Num_Cols = 1,
@Fixed_Data_Size = 2019 * 2,
@Num_Variable_Cols = 0,
@Max_Var_Size = 0
-- 保留行中称为空位图的部分以管理列的为空性。计算大小:
DECLARE
@Null_Bitmap int
SELECT
@Null_Bitmap = 2 + ((@Num_Cols + 7) / 8)
--只应使用该表达式的整数部分。而去掉其余部分。
--计算可变长度数据的大小:
DECLARE
@Variable_Data_Size int
--如果没有可变长度列,请将 Variable_Data_Size 设置为 0。
SELECT
@Variable_Data_Size = 0
--计算总的行大小:
DECLARE
@Row_Size int
SELECT
@Row_Size = @Fixed_Data_Size + @Variable_Data_Size + @Null_Bitmap + 4
--公式中的值 4 是数据行的行标题开销。
--下一步,计算每页的行数(每页有 8096 可用字节):
SELECT
Rows_Per_Page = 8096 / (@Row_Size + 2)
-- 创建2个测试表
CREATE TABLE [dbo].[Table_2019](id int,[Data] [nchar](2019) NOT NULL)
CREATE TABLE [dbo].[Table_2020](id int,[Data] [nchar](2020) NOT NULL)
go
-- 填充数据
declare @i int
set @i = 0
while(@i < 20)
begin
insert Table_2019(id,Data) values(@i,'')
insert Table_2020(id,Data) values(@i,'')
select @i = @i + 1
end
go