web-dev-qa-db-ja.com

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

私はもっ​​と何をすべきか分かりません、何か考えはありますか?

5
Softlion

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では物理的に削除されないことに注意してください。その後、「ゴーストクリーンアップ」プロセスがそれを行います。

5
gbn

Enterprise Managerを使用して、そのデータベースファイルを圧縮できます。データベースを右クリックし、[すべてのタスク]-> [データベースの縮小]をクリックします。

0
Raj