Sql-Server
tsql:大行刪除後表數據大小不會縮小
我有一張包含 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 上物理刪除。之後會執行“幽靈清理”過程。