sql server 測試delete后數據空間情況


總結結論:

  【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 表,是會釋放數據空間(即把占用部分數據空間置為空閑)給數據文件(注意,這里是給數據文件而不是操作系統,數據文件本身大小不會改變),然后所有表對象的增刪改都可以使用這部分空間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM