【发布时间】:2017-01-05 07:01:39
【问题描述】:
我在学习 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我在其中插入了 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')
现在我更改表并将列大小减少到 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')
问题
根据我在更改表之前的理解,该表的列的组合大小大于 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')
我没有在表中插入任何记录上面脚本的结果如图所示
请告知为什么即使在更改列大小之后分配单元也没有改变?
【问题讨论】:
-
如果您将此问题迁移到 dba.stackexchange.com,您可能会得到更好的答案,请参阅:meta.stackexchange.com/questions/10249/…
-
如何将此问题迁移到 dba.stackexchange.com
-
感谢朋友@VladimirBaranov
标签: sql sql-server