Sql-Server

tsql:大行刪除後表數據大小不會縮小

  • October 29, 2021

我有一張包含 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

這些值意味著表格的每一行大約是 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;

結果

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

我不知道該怎麼做,有什麼想法嗎?

嘗試ALTER INDEX ALL ON mytable REBUILD

由於索引大小值如此之高,這指向非聚集索引。聚集索引大小通常非常小。

all_indexes使用 DBCC SHOWCONTIG 命令時可以查看參數:

dbcc showcontig ('Risk') with all_indexes, tableresults;

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

name      rows       reserved  data     index_size  unused
BigTable  1041302384 71256288  70793880 460832      1576

請注意,刪除的記錄不會在 DELETE 上物理刪除。之後會執行“幽靈清理”過程。

引用自:https://dba.stackexchange.com/questions/11134