堆結構導致資料檔案不能收縮

2021-09-03 04:53:02 字數 1403 閱讀 3109

堆(heap)結構時,有一種情形導致表(table)的空間持續增長,卻不能收縮。

一、搭建測試環境

1. 建立資料庫

create database [db01]

on  primary

( name = n'db01', filename = n'c:\sqldata\db01.mdf' , size = 5120kb , filegrowth = 1024kb )

log on

( name = n'db01_log', filename = n'c:\sqldata\db01_log.ldf' , size = 1024kb , filegrowth = 1024kb)

alter database [db01] set recovery ******

2. 建立表

use db01

create table table1

(userid int,pwd char(20),otherinfo char(4100),modifydate datetime)

3. 新增記錄

declare @i int

set @i=0

while @i<1000

begin

insert into table1

select @i, cast(floor(rand()*100000) as varchar(20)), cast(floor(rand()*100000) as char(4100)), getdate()

set @i=@i+1

end4.刪除記錄,只保留最後一條記錄

delete table1 where userid < 999

5. 嘗試收縮資料檔案

dbcc shrinkfile (n'db01' , 0, truncateonly)

6. 檢視資料庫的磁碟使用空間

此時,mdf檔案為11mb。而這個資料庫最初建立時為5mb。

二、**空間的2種方法

1. 建立聚集索引,再收縮

create clustered index ix_table1_userid on table1 (userid)

dbcc shrinkfile (n'db01' , 0, truncateonly)

2. 重建表,再收縮

alter table table1 rebuild

dbcc shrinkfile (n'db01' , 0, truncateonly)

MySQL資料檔案收縮問題

mysql使用一段時間後,資料檔案ibdata會增長得很大 主要是針對innodb的儲存方式,有大量插入刪除操作的資料庫 有沒有很好的辦法可以收縮 shrink 資料檔案呢?在網上查了一下,沒有太好的辦法,只提到刪除重建資料檔案的方式,實際就是備份 刪除 恢復的方法,我試驗了一下,基本可行,但還是有...

MySQL資料檔案收縮問題

mysql使用一段時間後,資料檔案ibdata會增長得很大 主要是針對innodb的儲存方式,有大量插入刪除操作的資料庫 有沒有很好的辦法可以收縮 shrink 資料檔案呢?在網上查了一下,沒有太好的辦法,只提到刪除重建資料檔案的方式,實際就是備份 刪除 恢復的方法,我試驗了一下,基本可行,但還是有...

autoShrink和手動收縮資料檔案

1 當autoshrink開啟時,如果手動收縮資料檔案,會提示錯誤,因為此時有個後台執行緒正在收縮資料檔案,那有沒有辦法kill掉這個後台執行緒呢?答案是沒有,只能關閉資料庫選項autoshrink,然後一直等到,直到該執行緒自己結束!詳細的說明在 這裡 2 能不能收縮資料檔案?看看收縮資料檔案的缺...