當須要對一個很是大的表INSERT的時候,會消耗很是多的資源,由於update表的時候,oracle須要生成 redo log和undo log;此時最好的解決辦法是用insert, 而且將表設置爲nologging;當把表設爲nologging後,而且使用的insert時,速度是最快的,這個時候oracle只會生成最低限度的必須的redo log,而沒有一點undo信息。若是有可能將index也刪除,重建
1.alter table table_name nologging;
2. insert into table_name select * from xxxx; html
對此有了更好的解決方法:sql
一、alter table nologging;
註釋:Nologging的設置跟數據庫的運行模式有關
a、查詢當前數據庫的歸檔狀態:
select name,log_mode from v$database;
默認爲 NOARCHIVELOG 非歸檔
b、nologging在歸檔模式下有效,非歸檔模式nologging不起什麼做用
c、爲了提升插入的速度,咱們能夠對錶關閉寫log功能。 SQL 以下:數據庫
二、drop掉索引約束之類的;數據結構
三、 使用直接插入的方式oracle
insert/*+append+*/into tb_name select colnam1,colname2 from table_name; app
a,數據庫處於歸檔模式:當表模式爲logging狀態時,不管是否使用append模式,都會生成redo.當表模式爲nologging狀態時,只有append模式,不會生成redo。性能
數據庫處於非歸檔模式:不管是在logging仍是nologing的模式下,append的模式都不會生成redo,而no append模式下都會生成redo。 測試
b,建議不要常用append,這樣表空間會一直在高水位上,除非你這個表只插不刪日誌
c,在使用了append選項之後,insert數據會直接加到表的最後面,而不會在表的空閒塊中插入數據。htm
使用append會增長數據插入的速度。
的做用是在表的高水位上分配空間,再也不使用表的extent中的空餘空間
append 屬於direct insert,歸檔模式下append+table nologging會大量減小日誌,
非歸檔模式append會大量減小日誌,append方式插入只會產生不多的undo
不去尋找 freelist 中的free block , 直接在table HWM 上面加入數據。
4,總結
測試證實:
1. 無論哪一種模式下append要與nologging方式聯用才能達到很好的效果。
2. 非歸檔與歸檔方式,只用NOLOGGING是不起效果的。
3. 非歸檔下append已達到不錯的效果,但不及與nologging的聯用方式。
4. 歸檔下單append起不到效果。
NOLOGGING插完後最好作個備份。
另外,若是庫處在FORCELOGGING模式下,此時的nologging方式是無效的。
Oracle數據庫有聯機重作日誌,這個日誌是記錄對數據庫所作的修改,好比插入,刪除,更新數據等,對這些操做都會記錄在聯機重作日誌裏。通常數據庫至少要有2個聯機重作日誌組。當一個聯機重作日誌組被寫滿的時候,就會發生日誌切換,這時聯機重作日誌組2成爲當前使用的日誌,當聯機重作日誌組2寫滿的時候,又會發生日誌切換,去寫聯機重作日誌組1,就這樣反覆進行。
若是數據庫處於非歸檔模式,聯機日誌在切換時就會丟棄. 而在歸檔模式下,當發生日誌切換的時候,被切換的日誌會進行歸檔。好比,當前在使用聯機重作日誌1,當1寫滿的時候,發生日誌切換,開始寫聯機重作日誌2,這時聯機重作日誌1的內容會被拷貝到另一個指定的目錄下。這個目錄叫作歸檔目錄,拷貝的文件叫歸檔重作日誌。
數據庫使用歸檔方式運行時才能夠進行災難性恢復。
1.歸檔日誌模式和非歸檔日誌模式的區別
非歸檔模式只能作冷備份,而且恢復時只能作徹底備份.最近一次徹底備份到系統出錯期間的數據不能恢復.
歸檔模式能夠作熱備份,而且能夠作增量備份,能夠作部分恢復.
原文連接:https://www.cnblogs.com/tdskee/p/8607474.html
redo與undo
1. 什麼是redo(用於重作數據)
redo也就是重作日誌文件(redo log file),Oracle維護着兩類重作日誌文件:在線(online)重作日誌文件和歸檔(archived)重作日誌文件。這兩類重作日誌文件都用於恢復;其主要目的是,萬一實例失敗或介質失敗,它們可以恢復數據。 因爲數據庫緩衝,對磁盤數據的更新不是實時的,可是對redo日誌的更新會在commit以後確切發生。 若是在事務提交以後,磁盤數據更新以前,系統發生故障,好比斷電,系統重啓以後會將那些已經寫入redo,可是沒有更新到磁盤的數據進行重作,這樣系統就恢復到故障點以前了。 redo日誌默認3組,循環寫入,第一組(每一個組全部成員同時寫入一樣的信息)滿了,切換到第二個,第二個滿了切換到第三個,當全部組都寫滿以後,日誌進程再次開始寫第一個,後面的數據覆蓋前面的數據,即爲非歸檔模式。 鑑於redo如此重要,須要將已寫滿的日誌歸檔,即複製內容到其餘地方,即開啓歸檔日誌模式,可是會影響系統性能。
2. 什麼是undo(用於回滾數據)
從概念上講,undo正好與redo相對。你對數據執行修改時,數據庫會生成undo信息,這樣萬一你執行的事務或語句因爲某種緣由失敗了,或者若是你用一條ROLLBACK語句請求回滾,就能夠利用這些undo信息將數據放回到修改前的樣子。redo用於在失敗時重放事務(即恢復事務),undo則用於取消一條語句或一組語句的做用。 undo保存在undo表空間中,且包含在redo日誌中。 當執行DML操做時,舊數據會寫入undo中。 事務回滾,未提交時,rollback,把undo中的舊數據從新寫回數據段中;已提交時,進行閃回(flashback)操做 ,大多都是基於undo數據實現的。讀一致性:用戶檢索數據時,ORACLE老是使用戶只能看到被提交過的數據(當前事務中的其餘語句能夠看到未提交的數據),或者特定時間點的數據(select語句時間點)。當某個用戶在此查詢點以後修改了數據,此查詢讀到這個數據時,就是經過在undo中讀取來實現的。 oracle使用scn來實現讀一致性,系統變化號(SCN)是一個數據結構,它定義了一個給定時刻提交的數據庫版本,SCN能夠被認爲是oracle的邏輯時鐘,每一次提交數值都要增長。