2012-02-24 84 views
2

在數據庫中插入一行可以爲其添加數據。在數據庫中刪除一行可用空間嗎?或者只是在不更改已用空間量的情況下刪除該行?刪除數據庫中的某行會使該數據庫釋放空間嗎?

+0

這是關於MySQL或(微軟)sql服務器?你標記了兩個! – bfavaretto 2012-02-24 21:15:29

+0

你爲什麼要標記'MySQL'和'SQL-Server'?兩者的具體情況會有所不同,所以這是兩個不同的問題。 – 2012-02-24 21:16:17

+0

@MartinSmith這可能是一個很好的問題,就是不同的DB系統如何處理已刪除行的空間。 – 2012-02-24 21:21:16

回答

2

對於SQL,這取決於誰的立場。例如,如果您可以在磁盤空間不足之前插入一百萬行,如果刪除它們的一半,則可以再次插入五百萬行。 (忽略事務日誌記錄 - 想象一下日誌記錄是在其他地方完成的)

數據文件長大後不會縮小。因此數據文件使用的驅動器空間不可用於操作系統或任何其他應用程序。直到數據庫收縮操作完成。這將重新安排文件內的數據以釋放驅動器上的空間以供OS或其他應用程序使用。

+0

如果我理解你的答案,數據庫將重新使用這個空間,但是如果它在刪除之前是10GB,那麼它仍然是10GB,儘管它的大小是50萬行。那是對的嗎? – DataGirl 2012-02-24 21:18:03

+1

@DataGirl是的,就是這樣。如果需要回收實際的物理磁盤空間,DBA將不得不對mdf文件執行維護以收縮它。 – arcain 2012-02-24 21:36:45

2

Ask Tom說甲骨文:

當您從表中刪除該數據 - 塊會去到 空閒列表該表(假設塊 被釋放下跌的空間量低於pctused)。這些塊將用於 後續插入和更新到此表中。

當您從索引中刪除數據時 - 如果索引條目 打開的塊現在爲「空」 - 該塊將返回到索引結構中任何位置使用的freelist。否則,該塊保留在原來的位置,並且 自然會進入該塊的數據(因爲它在 b *樹中的位置)將會到達那裏。

刪除時有效地重用空間。您的數據庫不會 顯示dba_free_space中的任何新的可用空間 - 它將在更多的塊上有更多的塊,包括空閒列表中的 以及索引結構中的更多空洞。

+0

只是爲了清楚起見:這適用於Oracle數據庫。 – 2012-02-24 21:19:31

+0

你說得對,我沒有看清標籤。 – roymustang86 2012-02-24 21:25:39

3

當您使用Oracle時,可以使用specific commands立即回收已刪除行中的空間。否則它將保留爲新的行,如@ oymustang86提到的。