關於oracle使用delete刪除的問題

2021-08-29 08:36:39 字數 881 閱讀 7008

問題:

在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;

關於Oracle使用總結

select a into b from table name 必須只存在一條記錄 必須能夠查到值,如果查不到記錄則報錯,nodatafount a 表示 a select from a pay flow a where a.cons no a and rownum 1 select from a ...

oracle關於時間的使用

一 加減 date型別可以直接加減天數,加減月份要勇add months select e.hiredate 30 24 60 60 20 24 60 5 24 as hiredate from emp e where rownum 1 1980 12 17 5 20 30 select e.hir...

關於oracle函式listagg的使用說明

工作中經常遇到客戶提出這樣的需求,希望在彙總合併中,能夠把日期逐個列舉出來。如圖,原始資料是這樣的 客戶希望能夠實現這樣的彙總合併 那麼通常我會使用listagg這個函式,但是好多網上都是系統的全面的介紹listagg這個函式的使用方法,看起來很費力氣。在這裡我簡明扼要的說明一下 實現這個需求的語句...