關於如何oracle中快速清除表中的資料

2021-08-17 09:11:00 字數 1729 閱讀 9504

在oracle中,對於資料庫中的大資料量在delete時,速度那是相當的慢。其實可以有另外的刪除資料的方法,就是可以使用truncate來刪除表中的資料。但這種方法在刪除時,雖然速度比delete快很多。但由於是不可回滾的,因此在truncate後,資料是無法恢復的。這一點很重要,一定要記牢。

下面,我們來了解一下為什麼truncate會比delete快很多。

它們都是刪除表中的資料,而不能刪除表結構,delete 可以刪除整個表的資料也可以刪除表中某一條或n條滿足條件的資料,而truncate只能刪除整個表的資料,一般我們把delete 操作收作刪除表,而truncate操作叫作截斷表。

truncate操作與delete操作對比

操作 回滾 

高水線 

空間 效率

truncate 

不能 下降 

** 快

delete 

可以 不變 

不** 

慢下面分別用例項檢視它們的不同

1、回滾

首先要明白兩點

1.在oracle 中資料刪除後還能回滾是因為它把原始資料放到了undo表空間,

2.dml語句使用undo表空間,ddl語句不使用undo,而delete是dml語句,truncate是ddl語句,別外ddl語句是隱式提交.

所以truncate操用不能回滾,而delete操作可以.

2、高水線

所有的oracle表都有乙個容納資料的上限(很象乙個水庫歷史最高的水位),我們把這個上限稱為「high water mark」或hwm。這個hwm是乙個標記(專門有乙個資料塊用來記錄高水標記等),用來說明已經有多少資料塊分配給這個表. hwm通常增長的幅度為一次5個資料塊.

delete語句不影響表所占用的資料塊, 高水線(high watermark)保持原位置不動

truncate 語句預設情況下空間釋放,除非使用reuse storage; 

truncate會將高水線復位

高水線的作用: hwm對資料庫的操作有如下影響:

a) 全表掃瞄通常要讀出直到hwm標記的所有的屬於該錶資料庫塊,即使該表中沒有任何資料。

因此高水線是oracle優化時乙個重要的引數

3、空間

既然高水線用來說明已經有多少資料塊分配給這個表,那麼高水線也可理解為表的空間占用。

即使delete將表中的資料全部刪除,hwm還是為原值,所以還有那麼多的空間分配給這個表,即它的空間還沒有**,

而truncate表後高水線變為0,那現在它就表示沒有分配空間,即它的空間被**了。

4、效率

在相同的資料量刪除的情況下,truncate會比delete快幾十倍。這個在真實的環境中測試過。

另外,在truncate時,當表中有主外來鍵約束時,會丟擲如下的錯誤:

truncate table table_name * error 位於第 1 行: ora-02266: 表中的唯一/主鍵被啟用的外部關鍵字引用。

處理此問題的總體思路是:先將表中的主外來鍵設定為不可用,設定成功後,則就可以truncate了。truncate後,一定要再次將主外來鍵設定為可用。否則可能引發其他重大問題哦!

具體處理方法如下:

alter table table_name disable primary key cascade; --表已更改。

truncate table table_name; --表已截掉。

alter table table_name enable primary key;-- 表已更改。

關於如何清除浮動

在了解如何清除浮動之前,我們先了解一下為什麼我們要對元素進行浮動。我們都知道,div作為乙個塊標籤來說,它是獨佔一行,從上而下排列的,這就是所謂的標準流。但是,在實際應用中,我們有時需要將兩個或者多個div在一行顯示,這時,我們就要對元素進行浮動已達到這個結果。浮動之後的元素已經脫離了文件流,漂浮於...

html中如何清除浮動

在html中,浮動可以說是比較常用的。在頁面的布局中他有著很大的作用,但是浮動中存在的問題也是比較多的。現在我們簡單說一下怎麼去除浮動 首先我們先簡單的看一下浮動 首先我們先建立乙個簡單的div,並在其中再放兩個div,並且給他們不同的樣式。css樣式 div1 left right html 效果...

關於BFC詳解以及如何清除浮動

一 什麼是bfc?ifc?bfc block formatting context 即 塊級格式化上下文 ifc inline formatting context 即行內格式化上下文。常規流 也稱標準流 普通流 是乙個文件在被顯示時最常見的布局形態。乙個框在常規流中必須屬於乙個格式化上下文,你可以...