Sql server 在大型表中删除列时的注意事项

Sql server 在大型表中删除列时的注意事项,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有一个调用数据表,它已经增长到13亿行和173GB的数据。有两列我们不再使用,一列是char(15),另一列是varchar(24)。它们都被插入NULL已经有一段时间了,我一直推迟删除这些列,因为我不确定其含义。我们在带有数据库的驱动器和带有事务日志的驱动器上都有有限的空间 此外,我还发现,在完成DBCC REINDEX之前,空间是不可用的。我认为这既是好的也是坏的。这是好的,因为删除列应该非常快,并且不涉及大量日志记录,但不好,因为空间不会被回收。不过,新插入的记录占用的空间会更少吗?在我

我有一个调用数据表,它已经增长到13亿行和173GB的数据。有两列我们不再使用,一列是char(15),另一列是varchar(24)。它们都被插入NULL已经有一段时间了,我一直推迟删除这些列,因为我不确定其含义。我们在带有数据库的驱动器和带有事务日志的驱动器上都有有限的空间

此外,我还发现,在完成DBCC REINDEX之前,空间是不可用的。我认为这既是好的也是坏的。这是好的,因为删除列应该非常快,并且不涉及大量日志记录,但不好,因为空间不会被回收。不过,新插入的记录占用的空间会更少吗?在我的例子中,这很好,因为我们在18个月后删减了旧数据,所以空间将逐渐减少


如果我们做了DBCC REINDEX(或ALTER INDEX REBUILD),由于列不是任何索引的一部分,这实际上会有帮助吗?这会占用日志空间还是锁定表使其无法使用?

我发现您的问题很有趣,因此决定在开发数据库上对其进行建模。 SQL Server 2008,数据库大小400 Mb,日志2.4 Gb。 我假设,从链接中,您创建了一个具有聚集索引的表:

CREATE TABLE [dbo].[big_table](
    [recordID] [int] IDENTITY(1,1) NOT NULL,
    [col1] [varchar](50) NOT NULL,
    [col2] [char](15) NULL,
    [col3] [varchar](24) NULL,
 CONSTRAINT [PK_big_table] PRIMARY KEY CLUSTERED 
(
    [recordID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] 
该表由1200万条记录组成

sp_spaceused big_table, true

name-big_table, rows-12031303, reserved-399240 KB, data-397760 KB, index_size-1336 KB, unused-144 KB. 
下拉列表

sp_spaceused big_table, true
桌子大小保持不变。数据库和日志大小保持不变

将300万行添加到表的其余部分

name-big_table, rows-15031303, reserved-511816 KB, data-509904 KB, index_size-1752 KB, unused-160 KB.
数据库大小为500 Mb,日志容量为3.27 Gb

之后

DBCC DBREINDEX( big_table )
日志大小相同,但数据库大小增加到866MB

name-big_table, rows-12031303, reserved-338376 KB, data-337704  KB, index_size-568 KB, unused-104 KB. 
再次添加300万行,查看它们是否进入数据库中的可用空间。 数据库大小相同,日志为3.96GB,这清楚地表明它们是相同的


希望它有意义。

不,新插入的记录不会占用更少的空间。今天早些时候,我正在研究这个问题

试验台 偏移量查询 现在做一些改变

ALTER TABLE T 
ALTER COLUMN FixedWidthColToBeWidened char(12)

ALTER TABLE T 
ALTER COLUMN FixedWidthColToBeShortened char(10)

ALTER TABLE T 
ALTER COLUMN VariableWidthColToBeWidened varchar(12)

ALTER TABLE T 
ALTER COLUMN VariableWidthColToBeShortened varchar(10)

ALTER TABLE T 
DROP COLUMN FixedWidthColToBeDropped, VariableWidthColToBeDropped
再看看桌子

column_name                    column_id   max_inrow_length leaf_offset wasted_space
------------------------------ ----------- ---------------- ----------- ------------
id                             1           4                4           0
Dropped                        NULL        10               8           10
Dropped                        NULL        7                18          7
FixedWidthColToBeShortened     5           10               25          10
FixedWidthColToBeWidened       4           12               45          0
Dropped                        NULL        10               -1          2
VariableWidthColToBeWidened    6           12               -2          0
Dropped                        NULL        20               -3          2
VariableWidthColWontBeAltered  8           20               -4          0
VariableWidthColToBeShortened  7           10               -5          0
Total                          NULL        NULL             NULL        31
插入一行并查看页面

INSERT INTO T
           ([FixedWidthColToBeWidened]
           ,[FixedWidthColToBeShortened]
           ,[VariableWidthColToBeWidened]
           ,[VariableWidthColToBeShortened])
     VALUES
           ('1','2','3','4')

DECLARE @DBCCPAGE nvarchar(100)

SELECT TOP 1  @DBCCPAGE = 'DBCC PAGE(''tempdb'',' + CAST(file_id AS VARCHAR) + ',' + CAST(page_id AS VARCHAR) + ',3)'
FROM T
CROSS APPLY sys.fn_PhysLocCracker(%%physloc%%) 

DBCC TRACEON(3604)
EXEC (@DBCCPAGE)    
返回

Record Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 75                     
Memory Dump @0x000000000D5CA060

0000000000000000:   30003900 01000000 26a44500 00000000 †0.9.....&¤E..... 
0000000000000010:   ffffffff ffffff7f 00322020 20202020 †ÿÿÿÿÿÿÿ..2       
0000000000000020:   20202003 00000000 98935c0d 00312020 †   ......\..1   
0000000000000030:   20202020 20202020 200a0080 00050049 †         ......I 
0000000000000040:   004a004a 004a004b 003334†††††††††††††.J.J.J.K.34      

Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4

id = 1                               

Slot 0 Column 67108868 Offset 0x8 Length 0 Length (physical) 10

DROPPED = NULL                       

Slot 0 Column 67108869 Offset 0x0 Length 0 Length (physical) 0

DROPPED = NULL                       

Slot 0 Column 67108865 Offset 0x12 Length 0 Length (physical) 7

DROPPED = NULL                       

Slot 0 Column 67108866 Offset 0x19 Length 0 Length (physical) 20

DROPPED = NULL                       

Slot 0 Column 6 Offset 0x49 Length 1 Length (physical) 1

VariableWidthColToBeWidened = 3      

Slot 0 Column 67108867 Offset 0x0 Length 0 Length (physical) 0

DROPPED = NULL                       

Slot 0 Column 8 Offset 0x0 Length 0 Length (physical) 0

VariableWidthColWontBeAltered = [NULL]                                    

Slot 0 Column 4 Offset 0x2d Length 12 Length (physical) 12

FixedWidthColToBeWidened = 1                                              

Slot 0 Column 5 Offset 0x19 Length 10 Length (physical) 10

FixedWidthColToBeShortened = 2                                            

Slot 0 Column 7 Offset 0x4a Length 1 Length (physical) 1

VariableWidthColToBeShortened = 4    

Slot 0 Offset 0x0 Length 0 Length (physical) 0

KeyHashValue = (010086470766)      
您可以看到被删除(和更改)的列仍然在消耗空间,即使在更改架构时表实际上是空的


在您的案例中,删除的列的影响将是
15
字节浪费在
char
上,而
varchar
one浪费2字节,除非
variable部分的最后一列不会占用任何空间。

添加300万行后,行数似乎保持在12031303,这是复制/粘贴错误还是使用了sp_空间?同样在重新索引之后,它显示了1200万行,与最初的397mb数据大小相比,338mb数据大小更小……哎呀,黛西!复制+粘贴错误。试图制作漂亮的格式。顺便问一下:你需要添加记录的代码吗?如果您愿意,可以在您的开发数据库中查看。数据与“sp_spaceused big_table,true”中显示的数据完全相同。请注意,mdf fila的实际大小已增加。您能否给出确切的表架构,以便我们了解删除这些列对每页行的影响?
column_name                    column_id   max_inrow_length leaf_offset wasted_space
------------------------------ ----------- ---------------- ----------- ------------
id                             1           4                4           0
Dropped                        NULL        10               8           10
Dropped                        NULL        7                18          7
FixedWidthColToBeShortened     5           10               25          10
FixedWidthColToBeWidened       4           12               45          0
Dropped                        NULL        10               -1          2
VariableWidthColToBeWidened    6           12               -2          0
Dropped                        NULL        20               -3          2
VariableWidthColWontBeAltered  8           20               -4          0
VariableWidthColToBeShortened  7           10               -5          0
Total                          NULL        NULL             NULL        31
INSERT INTO T
           ([FixedWidthColToBeWidened]
           ,[FixedWidthColToBeShortened]
           ,[VariableWidthColToBeWidened]
           ,[VariableWidthColToBeShortened])
     VALUES
           ('1','2','3','4')

DECLARE @DBCCPAGE nvarchar(100)

SELECT TOP 1  @DBCCPAGE = 'DBCC PAGE(''tempdb'',' + CAST(file_id AS VARCHAR) + ',' + CAST(page_id AS VARCHAR) + ',3)'
FROM T
CROSS APPLY sys.fn_PhysLocCracker(%%physloc%%) 

DBCC TRACEON(3604)
EXEC (@DBCCPAGE)    
Record Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 75                     
Memory Dump @0x000000000D5CA060

0000000000000000:   30003900 01000000 26a44500 00000000 †0.9.....&¤E..... 
0000000000000010:   ffffffff ffffff7f 00322020 20202020 †ÿÿÿÿÿÿÿ..2       
0000000000000020:   20202003 00000000 98935c0d 00312020 †   ......\..1   
0000000000000030:   20202020 20202020 200a0080 00050049 †         ......I 
0000000000000040:   004a004a 004a004b 003334†††††††††††††.J.J.J.K.34      

Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4

id = 1                               

Slot 0 Column 67108868 Offset 0x8 Length 0 Length (physical) 10

DROPPED = NULL                       

Slot 0 Column 67108869 Offset 0x0 Length 0 Length (physical) 0

DROPPED = NULL                       

Slot 0 Column 67108865 Offset 0x12 Length 0 Length (physical) 7

DROPPED = NULL                       

Slot 0 Column 67108866 Offset 0x19 Length 0 Length (physical) 20

DROPPED = NULL                       

Slot 0 Column 6 Offset 0x49 Length 1 Length (physical) 1

VariableWidthColToBeWidened = 3      

Slot 0 Column 67108867 Offset 0x0 Length 0 Length (physical) 0

DROPPED = NULL                       

Slot 0 Column 8 Offset 0x0 Length 0 Length (physical) 0

VariableWidthColWontBeAltered = [NULL]                                    

Slot 0 Column 4 Offset 0x2d Length 12 Length (physical) 12

FixedWidthColToBeWidened = 1                                              

Slot 0 Column 5 Offset 0x19 Length 10 Length (physical) 10

FixedWidthColToBeShortened = 2                                            

Slot 0 Column 7 Offset 0x4a Length 1 Length (physical) 1

VariableWidthColToBeShortened = 4    

Slot 0 Offset 0x0 Length 0 Length (physical) 0

KeyHashValue = (010086470766)