1. 程式人生 > >很精闢的oracle高水位線,終於知道DELETE和TRUNCATE為什麼不一樣了

很精闢的oracle高水位線,終於知道DELETE和TRUNCATE為什麼不一樣了

一、Oracle表段中的高水位線HWM
在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在資料庫表剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說HWM為最低值。當插入了資料以後,高水位線就會上漲,但是這裡也有一個特性,就是如果你採用delete語句刪除資料的話,資料雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除資料以前那麼高的水位。也就是說,這條高水位線在日常的增刪操作中只會上漲,不會下跌。
              
下面我們來談一下Oracle中Select語句的特性。Select語句會對錶中的資料進行一次掃描,但是究竟掃描多少資料儲存塊呢,這個並不是說資料庫中有多少資料,Oracle就掃描這麼大的資料塊,而是Oracle會掃描高水位線以下的資料塊。現在來想象一下,如果剛才是一張剛剛建立的空表,你進行了一次Select操作,那麼由於高水位線HWM在最低的0位置上,所以沒有資料塊需要被掃描,掃描時間會極短。而如果這個時候你首先插入了一千萬條資料,然後再用delete語句刪除這一千萬條資料。由於插入了一千萬條資料,所以這個時候的高水位線就在一千萬條資料這裡。後來刪除這一千萬條資料的時候,由於delete語句不影響高水位線,所以高水位線依然在一千萬條資料這裡。這個時候再一次用select語句進行掃描,雖然這個時候表中沒有資料,但是由於掃描是按照高水位線來的,所以需要把一千萬條資料的儲存空間都要掃描一次,也就是說這次掃描所需要的時間和掃描一千萬條資料所需要的時間是一樣多的。所以有時候有人總是經常說,怎麼我的表中沒有幾條資料,但是還是這麼慢呢,這個時候其實奧祕就是這裡的高水位線了。
                
那有沒有辦法讓高水位線下降呢,其實有一種比較簡單的方法,那就是採用TRUNCATE語句進行刪除資料。採用TRUNCATE語句刪除一個表的資料的時候,類似於重新建立了表,不僅把資料都刪除了,還把HWM給清空恢復為0。所以如果需要把表清空,在有可能利用TRUNCATE語句來刪除資料的時候就利用TRUNCATE語句來刪除表,特別是那種資料量有可能很大的臨時儲存表。
             
在手動段空間管理(Manual Segment Space Management)中,段中只有一個HWM,但是在Oracle9iRelease1才新增的自動段空間管理(Automatic Segment Space Management)中,又有了一個低HWM的概念出來。為什麼有了HWM還又有一個低HWM呢,這個是因為自動段空間管理的特性造成的。在手段段空間管理中,當資料插入以後,如果是插入到新的資料塊中,資料塊就會被自動格式化等待資料訪問。而在自動段空間管理中,資料插入到新的資料塊以後,資料塊並沒有被格式化,而是在第一次在第一次訪問這個資料塊的時候才格式化這個塊。所以我們又需要一條水位線,用來標示已經被格式化的塊。這條水位線就叫做低HWM。一般來說,低HWM肯定是低於等於HWM的。
                 
二、修正ORACLE表的高水位線

在ORACLE中,執行對錶的刪除操作不會降低該表的高水位線。而全表掃描將始終讀取一個段(extent)中所有低於高水位線標記的塊。如果在執行刪除操作後不降低高水位線標記,則將導致查詢語句的效能低下。下面的方法都可以降低高水位線標記。
1.執行表重建指令 alter table table_name move;
(線上轉移表空間ALTER TABLE 。。。 MOVE TABLESPACE 。。。ALTER TABLE 。。。 MOVE 後面不跟引數也行,不跟引數表還是在原來的表空間,move後記住重建索引。如果以後還要繼續向這個表增加資料,沒有必要move,只是釋放出來的空間,只能這個表用,其他的表或者segment無法使用該空間)
執行alter table table_name shrink space; 注意,此命令為Oracle 10g新增功能,再執行該指令之前必須允許行移動alter table table_name enable row movement;
 實質上構造一個新表(在內部表現為一系列的DML操作,即將副本插入新位置,刪除原來位置的記錄)靠近末尾處(右端)資料塊中的記錄往開始處(左端)的空閒空間處移動(DML操作),不會引起DML觸發器
當所有可能的移動被完成,高水位線將會往左端移動(DDL操作)
新的高水位線右邊的空閒空間被釋放(DDL操作)
       
實現前提條件
必須啟用行記錄轉移(enable row movement)
僅僅適用於堆表,且位於自動段空間管理的表空間(堆表包括:標準表,分割槽表,物化檢視容器,物化檢視日誌表)

3.複製要保留的資料到臨時表t,drop原表,然後rename臨時表t為原表
4.emp/imp
5.alter   table  table_name  deallocate   unused 
6.儘量truncate吧

-----------高水位線實驗---------------------------------------
create table HWM as select * from dba_objects;

SQL> SELECT segment_name, segment_type, blocks FROM dba_segments
     WHERE segment_name='HWM';    
     DBA_SEGMENTS.BLOCKS 表示分配給這個表的所有的資料庫塊的數目

SQL> ANALYZE TABLE hwm ESTIMATE STATISTICS;          

SQL> SELECT table_name,num_rows,blocks,empty_blocks
     FROM user_tables
     WHERE table_name='HWM';
     USER_TABLES.BLOCKS表示已經使用過的資料庫塊的數目,即水線。
     USER_TABLES.EMPTY_BLOCKS 代表分配給該表,但是在水線以上的資料庫塊,即從來沒有使用的資料塊。

SQL> SELECT COUNT (DISTINCT
     DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||
     DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"
     FROM hwm;
     有多少塊容納資料

SQL> delete from hwm;         
SQL> commit;
SQL> ANALYZE TABLE hwm ESTIMATE STATISTICS; 
SQL> SELECT table_name,num_rows,blocks,empty_blocks
     FROM user_tables
     WHERE table_name='HWM';

SQL> TRUNCATE TABLE hwm;  
SQL> ANALYZE TABLE hwm ESTIMATE STATISTICS;                  
SQL> SELECT table_name,num_rows,blocks,empty_blocks
     FROM user_tables
     WHERE table_name='HWM';



結論:使用delete不能使高水位線降低,使用truncate可以使用高水位線降低,
      所以當刪除整表資料或者分割槽最好是用truncate,
      當用delete刪除大表資料時後,還是要重建表,這樣可以降低高水位線

相關推薦

精闢oracle水位終於知道DELETETRUNCATE為什麼一樣

一、Oracle表段中的高水位線HWM在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在資料庫表剛建立的時候,由於沒有任

oracle 水位詳解

dbm 標示 man archive mark 新建 arc 有一種 art 一、什麽是水線(High Water Mark)? 所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的一個同義詞) 都有一個在段內容納數據的上限,我們把這個上

oracle 水位詳解(刪除大量資料後續處理)

一、oracle 高水位線詳解 一、什麼是水線(High Water Mark)? 所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的一個同義詞) 都有一個在段內容納資料的上限,我們把這個上限稱為"high water mark"或HWM。這個HWM是一個標記,

一、oracle 水位詳解

一、什麼是水線(High Water Mark)? 所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的一個同義詞) 都有一個在段內容納資料的上限,我們把這個上限稱為"high water mark"或HWM。這個HWM是一個標記,用來說明已經有多少沒

降低oracle水位方法總結(包括驗證結果)

1. 執行表重建指令 alter table table_name move(驗證不可行,不降低水位線,但可釋放表空間) 當你建立了一個物件如表以後,不管你有沒有插入資料,它都會佔用一些塊,ORACLE也會給它分配必要的空間.同樣,用ALTER TABLE MOVE釋放自由空間後,還是保留了一些

降低oracle水位方法總結

1. 執行表重建指令 alter table table_name move(驗證不可行,不降低水位線,但可釋放表空間)當你建立了一個物件如表以後,不管你有沒有插入資料,它都會佔用一些塊,ORACLE也會給它分配必要的空間.同樣,用ALTER TABLE MOVE釋放自由空間

oracle 水位(hwm)

 在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在資料庫表剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的

sql語句----drop、truncatedelete 精闢解析--終於知道ID為啥有時候連續

雖然西西不建議大家去用命令刪除資料庫表中的東西,但是這些刪除命令總有用的著的地方。 說到刪除表資料的關鍵字,大家記得最多的可能就是delete了 然而我們做資料庫開發,讀取資料庫資料.對另外的兩兄弟用得就比較少了 現在來介紹另外兩個兄弟,都是刪除表資料的,其實也是很容易理解的 老大-----

js jq 實現鼠標經過div背景以進度條方式 變寬鼠標離開變小同時文字顏色原來一樣

最大 java hidden pan absolute 顏色 tin http center 1 <!DOCTYPE html> 2 <html> 3 <head> 4 5 <title></tit

Oracle 學習----:查看當前時間與Sqlserver語句一樣

values get ins acl -- 當前 oracle into ora oracle:select sysdate from dual sqlserver: select getdate() ---------------------試試這個---

自制新型文字密碼聊天記錄的畫風都一樣再也不怕被女朋友偷窺手機

前言:當今社會是一個資訊社會,你的個人資訊和聊天記錄極有可能被別有用心的人時時刻刻監視著,那麼你想不想實現專屬於兩個人或一個小圈子的人在社交軟體上的交流不被任何其他人讀懂呢?下面就給大家提供一個原理極其簡單程式極其容易實現的C語言文字加密小程式的實現演算法。 PS:文章末尾有驚喜哦! 原理:ASCLL碼的

終於知道公司前端為啥加班

摘要:如何快速、高效地構建前端元件乃至頁面是解放前端生產力的重要標誌,掌握抽象元件和頁面模型,理解前端視覺化搭建思路,擺脫固有的開發模式,提高前端開發效率,是每位前端應該瞭解的。 本文分享自華為雲社群《【雲駐共創】前端視覺化框架是怎樣煉成的?》,原文作者:華為雲EI專家胡琦。 隨著移動網際網路的迅猛發展和 5

12_Delete釋放水位的問題truncate對比實驗

Delete不釋放高水位線的問題,與truncate對比實驗Oracle高水位線 HWM對資料庫影響:1. 全表掃描通常要讀取直到HWM標記內,所有屬於該表資料庫塊,即使該表中沒有任何資料,這樣將耗費更多的I/O資源;2. 即使HWM以下有空閒的資料庫塊,鍵入在插入資料時使用

Oracle表段中的水位HWM+修正ORACLE表的水位

Oracle表段中的高水位線HWM   在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在資料庫表剛建立的時候,由於沒有任

ORACLE---水位以及水位的破解法

高水位 1.什麼是高水位?(high water mark 簡稱:HWM)      所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的一個同義詞)都有一個在段記憶體放資料的上線,那麼我們把這個上線成為“high water mark”

水位基礎

清空 臨時 轉移表 適用於 能說 statistic stat 。。 sed 一、oracle 高水位線詳解 一、什麽是水線(High Water Mark)? 所有的oracle 段(segments,在此,為了理解方便,建議把segment 作為表

Oracle 水位問題

什麽 刪除表 查看 統計 響應時間 from 調整 位置 預留空間 Oracle 對數據段的管理有一個高水位(HWM, High Water Mark)的概念。高水位是數據段中使用過和未使用過的數據塊的分界線。高水位以下的數據塊是曾使用過的,以上的是從未被使用或初始化過的

Delete/Truncate刪除,釋放表空間、降低水位、resize釋放磁碟空間相關優化

硬碟空間不足,打算刪除資料庫中的多餘資料,但刪除資料後,硬碟硬碟空間不能釋放。 【delete後用:alter table table_name move    truncate後用:alter table table_name deallocate unused 均不可

水位全表掃描

   高水位線好比水庫中儲水的水位線,用於描述資料庫中段的擴充套件方式。高水位線對全表掃描方式有著至關重要的影響。當使用delete 操作 表記錄時,高水位線並不會下降,隨之導致的是全表掃描的實際開銷並沒有任何減少。本文給出高水位線的描述,如何降低高水位線,以及高水 位線對

水位引起的查詢變慢解決方法

眾所周知,隨著不斷地進行表記錄的DML操作,會不斷提高表的高水位線(HWM),DELETE操作之後雖然表的資料刪除了,但是並沒有降低表的高水位,除非你使用TRUNCATE操作,進行表查詢的時候,Oracle會掃表高水位以下的資料塊,也就是說,掃描的時間並不會有所減少。所以D