更改或更新表后,row_overflow数据未转换为in_row数据

Sma*_*003 6 sql sql-server

我正在学习Sql server中的分配单元,并了解了3种类型

  • In_row_data LOB_DATA
  • (大对象(LOB)数据).
  • 行溢出数据.

    IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE
         TABLE_NAME='TEST_ALLOCATION_UNITS')
    
     DROP TABLE TEST_ALLOCATION_UNITS
    CREATE TABLE TEST_ALLOCATION_UNITS(
     TEST_ID INT IDENTITY(1,1)
     ,NAME VARCHAR(4000)
     ,NAME1 VARCHAR(5000)
     )
     GO
    
    INSERT INTO TEST_ALLOCATION_UNITS (NAME,NAME1) VALUES ('APPLE','BANANA')
    GO 500
    
    Run Code Online (Sandbox Code Playgroud)

    我在其中插入了500条记录

不,我已经运行了代码,我得到了这样的结果

select s.type_desc before_alter from sys.allocation_units s 
join sys.partitions p on p.partition_id=s.container_id 
where p.object_id=object_id('test_allocation_units')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在我改变了表并将每个列的大小减少到50个字节,然后再次运行上面的select语句

alter table test_allocation_units alter column name varchar(50)
alter table test_allocation_units alter column name1 varchar(50)

select s.type_desc from sys.allocation_units s 
join sys.partitions p on p.partition_id=s.container_id
where p.object_id=object_id('test_allocation_units')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

根据我在更改表之前的理解,该表的组合大小大于8 Kb,因此分配类型是In_row_data和Row_overflow_data.但是在alter语句之后,即将列大小减少到每个50字节,那么分配单元仍然是In_row_data和Row_overflow_data

请解释.

提前致谢

情景2

我尝试使用空表并运行以下代码

IF EXISTS (
        SELECT 1
        FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'TEST_ALLOCATION_UNITS'
        )
    DROP TABLE TEST_ALLOCATION_UNITS

CREATE TABLE TEST_ALLOCATION_UNITS (
    TEST_ID INT IDENTITY(1, 1)
    ,NAME VARCHAR(4000)
    ,NAME1 VARCHAR(5000)
    )
GO

SELECT s.type_desc before_alter,s.total_pages,s.used_pages,s.data_pages
FROM sys.allocation_units s
JOIN sys.partitions p ON p.partition_id = s.container_id
WHERE p.object_id = object_id('test_allocation_units')

ALTER TABLE test_allocation_units
ALTER COLUMN NAME VARCHAR(50)

ALTER TABLE test_allocation_units
ALTER COLUMN name1 VARCHAR(50)

SELECT s.type_desc after_alter,s.total_pages,s.used_pages,s.data_pages
FROM sys.allocation_units s
JOIN sys.partitions p ON p.partition_id = s.container_id
WHERE p.object_id = object_id('test_allocation_units')
Run Code Online (Sandbox Code Playgroud)

我没有在表格中插入任何记录,上图中的结果显示在图中

在此输入图像描述

请注意为什么即使在改变列大小后分配单元没有改变?

CeO*_*Sql 1

要“重新分配”数据,您必须运行以下命令:

ALTER TABLE TEST_ALLOCATION_UNITS REBUILD

REBUILD 建议 SQL Server 在堆表上重新分配数据页。