圖 1 :分配給該表的塊。用灰色正方形表示行。 Oracle 不會釋放空間以供其他對象使用,有一條簡單的理由:由于空間是為新插入的行保留的,并且要適應現有行的增長。被占用的最高空間稱為最高使用標記 (HWM) ,如圖 2 所示。
圖 2 :行后面的塊已經刪除了; HWM 仍保持不變。 但是,這種方法有兩個主要的問題:
圖 3 :重組行后的表中的塊。 在執行該操作后,讓我們看一看空間利用率所發生的改變。使用在第一步展示的 PL/SQL 塊,可以看到塊現在是如何組織的: FS1 Blocks = 0 Bytes = 0 FS2 Blocks = 0 Bytes = 0 FS3 Blocks = 1 Bytes = 0 FS4 Blocks = 0 Bytes = 0 Full Blocks = 2 Bytes = 16384 注重這里的重要改變: FS4 塊(具有 75-100% 的空閑空間)的數量現在從 4,148 降為 0 。我們還看到 FS3 塊(具有 50-75% 的空閑空間)的數量從 0 增加到 1 。但是,由于 HWM 沒有被重置,總的空間利用率仍然是相同的。我們可以用如下命令檢查使用的空間: SQL> select blocks from user_segments where segment_name = 'BOOKINGS'; BLOCKS --------- 4224 由該表占用的塊的數量 (4,224) 仍然是相同的,這是因為并沒有把 HWM 從其原始位置移開。可以把 HWM 移動到一個較低的位置,并用如下命令回收空間: alter table bookings shrink space; 注重子句 COMPACT 沒有出現。該操作將把未用的塊返回給數據庫并重置 HWM 。可以通過檢查分配給表的空間來對其進行測試: SQL> select blocks from user_segments where segment_name = 'BOOKINGS'; BLOCKS ---------- 8 塊的數量從 4,224 降為 8 ;該表內所有未用的空間都返回給表空間,以讓其他段使用,如圖 4 所示。
圖 4 :在收縮后,把空閑塊返回給數據庫。 這個收縮操作完全是在聯機狀態下發生的,并且不會對用戶產生影響。 也可以用一條語句來壓縮表的索引: alter table bookings shrink space cascade; 聯機 shrink 命令是一個用于回收浪費的空間和重置 HWM 的強大的特性。我把后者(重置 HWM )看作該命令最有用的結果,因為它改進了全表掃描的性能。 找到收縮合適選擇 在執行聯機收縮前,用戶可能想通過確定能夠進行最完全壓縮的段,以找出最大的回報。只需簡單地使用 dbms_space 包中的內置函數 verify_shrink_candidate 。假如段可以收縮到 1,300,000 字節,則可以使用下面的 PL/SQL 代碼進行測試: begin if (dbms_space.verify_shrink_candidate ('ARUP','BOOKINGS','TABLE',1300000) then :x := 'T'; else :x := 'F'; end if; end;
|
新聞熱點
疑難解答