最近遇到oracle 表中資料量很大查詢和更新比較慢 需要刪除,發現刪除後查詢速度還是很慢,原來是delete oracle 高水位沒有下降的原因。
在oracle裡,使用delete刪除資料以後,資料庫的儲存容量不會減少,而且使用delete刪除某個表的資料以後,查詢這張表的速度和刪除之前一樣,不會發生變化。
因為oralce有乙個hwm高水位,它是oracle的乙個表使用空間最高水位線。當插入了資料以後,高水位線就會**,但是如果你採用delete語句刪除資料的話,資料雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除資料以前那麼高的水位。除非使用truncate刪除資料。那麼,這條高水位線在日常的增刪操作中只會**,不會**,所以資料庫容量也只會上公升,不會下降。而使用select語句查詢資料時,資料庫會掃瞄高水位線以下的資料塊,因為高水位線沒有變化,所以掃瞄的時間不會減少,所以才會出現使用delete刪除資料以後,查詢的速度還是和delete以前一樣
解決方案:
1.首先匯出表,然後truncate這張表,最後匯入這張表。
2.在儲存空間當中移動表,但是由於rowid會被打亂,所以需要重建索引.
3.如果是oracle 10g.可是直接更新表的高水位線。
對應的sql:
9i中:
create table aa_bak as select * from aa where record_time > sysdate - 10;
truncate table aa;
insert into aa select * from aa_bak;
drop table aa_bak;
10g 版本
alter tablename enable row movement;
alter tablename shrink space;
實戰:select count(*) from wlkp_fp_kj
查詢結果顯示2301245 條記錄
我們需要刪除一部分資料
刪除之前我們先檢視表的高水位線(wlkp_fp_kj 是張分割槽表)
select segment_name, segment_type, blocks from dba_segments where segment_name = 'wlkp_fp_kj'
刪除資料sql
select count(*) from wlkp_fp_kj where kprqto_date('2011-11-01 14:00:00', 'yyyy-mm-dd,hh24:mi:ss')
記錄條數 54802
刪除語句
delete from wlkp_fp_kj where kprqto_date('2011-11-01 14:00:00', 'yyyy-mm-dd,hh24:mi:ss')
刪除後查詢wlkp_fp_kj 表的高水位
發現查詢結果和上面沒有刪除之前一樣沒有變化。說明delete 語句高水位不會下降
我資料庫10g 直接用方法二實現
執行如下語句:
alter table wlkp_fp_kj enable row movement; alter table wlkp_fp_kj shrink space;
執行後結果在查詢wlkp_fp_kj的高水位
很明顯看到執行後高水位下降了。
SHRINK SEGMENT降低高水位
oracle 10g 語法 alter tableshrink space compact cascade alter tableshrink space compcat 收縮表,但會保持 high water mark 這怎麼理解?相當於沒回縮?相當於把塊中資料打結實了。沒有變動hwm alter...
ORACLE的高水位線
這幾天一直在看乙個問題,乙個統計程式突然統計的資料量不正常了,從頭查到尾,覺得程式和配置都沒有問題,但就是統計出的結果不對,但發現有乙個程式的入庫檔案還存留很多,推斷可能是資料還沒入庫完全,但是什麼導致的呢,以為是那部分檔案太大,入庫太慢,但後來發現還是資料庫的問題,乙個temp表查詢空表都花費很長...
oracle 高水位線詳解
一 什麼是水線 high water mark 所有的oracle段 segments,在此,為了理解方便,建議把segment作為表的乙個同義詞 都有乙個在段內容納資料的上限,我們把這個上限稱為 high water mark 或hwm。這個hwm是乙個標記,用來說明已經有多少沒有使用的資料塊分配...