我正在学习Sql server中的分配单元,并了解了3种类型
行溢出数据.
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)
我没有在表格中插入任何记录,上图中的结果显示在图中
请注意为什么即使在改变列大小后分配单元没有改变?
要“重新分配”数据,您必须运行以下命令:
ALTER TABLE TEST_ALLOCATION_UNITS REBUILD
REBUILD 建议 SQL Server 在堆表上重新分配数据页。
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |