tsql:大行删除后表数据大小不会缩小

Sof*_*ion 5 sql-server maintenance dbcc

我有一个包含 12 个月以上数据的表格。我备份表然后删除所有行,只保留上个月插入的行。但是表大小不会缩小,底层物理文件也不会缩小。

dbcc showcontig ('mytable') with tableresults;

ObjectName  ObjectId    IndexName   IndexId Level   Pages   Rows    MinimumRecordSize   MaximumRecordSize   AverageRecordSize   ForwardedRecords    Extents ExtentSwitches  AverageFreeBytes    AveragePageDensity  ScanDensity BestCount   ActualCount LogicalFragmentation    ExtentFragmentation
mytable 478624748   PK_Log  1   0   21344   467392  94  8033    237 0   2675    12918   2862,346    64,6361996540647    20,6517532316743    2668    12919   77,8392053973013    71,7757009345794


exec sp_spaceused 'mytable', @updateusage = 'TRUE'

name    rows    reserved    data    index_size  unused
LogTrace    467392      8984976 KB  8930056 KB  21984 KB    32936 KB
Run Code Online (Sandbox Code Playgroud)

这些值意味着表的每一行大约是 19MB!

我尝试在没有更改的情况下重建索引:ALTER INDEX PK_myindex ON mytable REBUILD

我尝试过的其他事情:

select
[FileSizeMB]    =
    convert(numeric(10,2),round(a.size/128.,2)),
[UsedSpaceMB]   =
    convert(numeric(10,2),round(fileproperty( a.name,'SpaceUsed')/128.,2)) ,
[UnusedSpaceMB] =
    convert(numeric(10,2),round((a.size-fileproperty( a.name,'SpaceUsed'))/128.,2)) ,
GrowthPct   =
    case when a.status & 0x00100000 = 1048576 then a.growth else null end,
GrowthMB    =
    convert(int,round(case when a.status & 0x00100000 = 1048576 then null else a.growth /128.000 end,0)),   
[DBFileName]    = a.name
from
sysfiles a;
Run Code Online (Sandbox Code Playgroud)

结果

FileSizeMB  UsedSpaceMB UnusedSpaceMB   GrowthPct   GrowthMB    DBFileName
9742.38 9740.06 2.31    NULL    1   mytable
72.25   15.45   56.80   NULL    1   mytable_log
3.00    0.06    2.94    NULL    1   mytable_indexes
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做,知道吗?

gbn*_*gbn 5

尝试 ALTER INDEX ALL ON mytable REBUILD

由于索引大小值如此之高,这指向非聚集索引。聚集索引的大小通常非常小。

您可以检查allindexesDBCC 上的参数

dbcc showcontig ('Risk') with allindexes, tableresults;
Run Code Online (Sandbox Code Playgroud)

例如,我的一张桌子。十亿行,70GB 表,450MB 索引

name      rows       reserved  data     index_size  unused
BigTable  1041302384 71256288  70793880 460832      1576
Run Code Online (Sandbox Code Playgroud)

编辑,2012 年 1 月

请注意,删除的记录不会在 DELETE 上物理删除。之后的“幽灵清理”过程会执行此操作。