總結結論:
【1】如果是索引組織表,刪除的數據空間是會被文件設置為可用狀態,其他表都可以使用。
【2】如果是堆表,刪除數據空間也會設置為可用狀態,但是只能給被刪除數據的表使用。
【3】truncate刪除表數據、drop table 表,是會釋放數據空間(即把占用部分數據空間置為空閑)給數據文件(注意,這里是給數據文件而不是操作系統,數據文件本身大小不會改變),然后所有表對象的增刪改都可以使用這部分空間。
1.測試delete后數據空間情況(聚集索引)
(1)文件大小
第1列為邏輯名稱,第2列為文件大小,第3列為數據占用大小,第4列為數據占用/文件大小 的百分比。
(2)數據表情況(本測試用test103表進行操作,占了240M)
(3)表結構
(4)刪除test103表200W數據
delete top(2000000) from test103
(5)查看驗證數據量
操作前:
操作后:
數據文件還漲了?事務日志文件怎么多了這么多,什么情況?
查看下增長規律:
(6)再次刪除200W條,查看數據文件
初步結論。(聚集索引)
在第1次刪除的時候(刪除200w)
數據文件:文件大小從260M-》320M,實際占用數據大小從260-》220M。 數據文件總大小加了60M,數據占用大小減少了40M左右。
日志文件:文件大小從380M-》1200M,實際占用大小從370M-》800M。。數據文件總大小加了800多M,實際數據占用增加了430M左右。
在第2次刪除的時候(刪除200w)
數據文件:文件大小從320M-》320M,實際占用數據大小從220M-》167M。 數據文件總大小加了0M,數據占用大小減少了53M。
日志文件:文件大小從1200M-》1588M,實際占用大小從800M-》1223M。。數據文件總大小加了400M左右,實際數據占用增加了430M左右。
2.插入操作
重新插入200W行數據到原表,
;with temp1 as ( select 1 as id,'a' as name,'b' as home,123456789 as phone,'gg' as 'desc' union all select id+1,'a' as name, home,phone+1,[desc] from temp1 where id <=2000000 ) insert into test103 from temp1 option(maxrecursion 0)
結果如下:
數據占用多了229-167 約等於50M
插入一個新表200W行(沒有聚集索引,即堆表)
;with temp1 as ( select 1 as id,'a' as name,'b' as home,123456789 as phone,'gg' as 'desc' union all select id+1,'a' as name, home,phone+1,[desc] from temp1 where id <=2000000 ) select * into test1 from temp1 option(maxrecursion 0)
結果如下:
結論:通過聚集索引刪除的數據,文件空間不會釋放,但是會置於空閑狀態。有其他數據使用的時候就會用次來填充。
3.Delete非聚集索引表,即堆表
直接刪除test1即上面新建的200W數據行的堆表
delete test1
再查看大小:
嗯哼~!沒有變化?
然后我們重復插入會該表100W數據看看。
插入完成之后來看看:
空間也沒有變。
那么我再插入50W條到test3表(一個新表),看看數據文件會不會增加。(為什么50W呢?我不想超出200W的上線,剛已經插入了100W了)
然后發現,增了??
難道,沒有聚集索引的堆表,刪除表數據后,數據只能給該表用?其他表不能占?
可能是這樣,但我還要進一步確認,剛剛我們刪除了test1表(堆表)的200W數據,后面又插入了100W數據,然而數據文件大小及實際數據占用內容並沒有變化。
我們現在再插入99W試一試,200W刪除-100W插入-99W插入,如果我們上面的推測是正確的,那么數據文件及文件實際占用也不會增加。
看看文件占用:
很明顯,我們的理論是正確的。
結論:delete刪除堆表數據,不會把數據空間置為空閑給交還給數據文件(注意,數據文件本身大小不會改變),然后所有表對象的增刪改都不可以使用這部分空間,只有被刪除數據的表才可以用這部分數據空間。
4.truncate 刪除數據
truncate table test1(堆表)
結果:
很明顯,truncate,是把數據空間占用給釋放出來了,后續所有的表都可以使用該空閑空間;
結論:truncate刪除表數據,是會釋放數據空間(即把占用部分數據空間置為空閑)給數據文件(注意,這里是給數據文件而不是操作系統,數據文件本身大小不會改變),然后所有表對象的增刪改都可以使用這部分空間。
5.drop 刪除表
再往test1表中,插入200W數據;
結果:
然后我們delete整個表看看
delete test1
結果:
依然沒有變化;
我們直接drop table test1看看
結果:
執行成功后,發現,數據空間也釋放出來了。
總結結論:
【1】如果是索引組織表,刪除的數據空間是會被文件設置為可用狀態,其他表都可以使用。
【2】如果是堆表,刪除數據空間也會設置為可用狀態,但是只能給被刪除數據的表使用。
【3】truncate刪除表數據、drop table 表,是會釋放數據空間(即把占用部分數據空間置為空閑)給數據文件(注意,這里是給數據文件而不是操作系統,數據文件本身大小不會改變),然后所有表對象的增刪改都可以使用這部分空間。