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
をお試しください
インデックスサイズの値が非常に高いため、これは非クラスター化インデックスを指します。通常、クラスター化インデックスのサイズは非常に小さいです。
DBCCのallindexes
パラメータで確認できます
dbcc showcontig ('Risk') with allindexes, tableresults;
たとえば、私のテーブルの1つ。 10億行、70 GBテーブル、450 MBインデックス
name rows reserved data index_size unused
BigTable 1041302384 71256288 70793880 460832 1576
編集、2012年1月
削除されたレコードは、DELETEでは物理的に削除されないことに注意してください。その後、「ゴーストクリーンアップ」プロセスがそれを行います。
Enterprise Managerを使用して、そのデータベースファイルを圧縮できます。データベースを右クリックし、[すべてのタスク]-> [データベースの縮小]をクリックします。