當需要對一個非常大的表INSERT的時候,會消耗非常多的資源,因為update表的時候,oracle需要生成 redo log和undo log;此時最好的解決辦法是用insert, 並且將表設置為nologging;當把表設為nologging後,並且使用的insert時,速度是最快的,這個時候o ...
當需要對一個非常大的表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;
對此有了更好的解決方法:
1、alter table nologging;
註釋:Nologging的設置跟資料庫的運行模式有關
a、查詢當前資料庫的歸檔狀態:
select name,log_mode from v$database;
預設為 NOARCHIVELOG 非歸檔
b、nologging在歸檔模式下有效,非歸檔模式nologging不起什麼作用
c、為了提高插入的速度,我們可以對錶關閉寫log功能。 SQL 如下:
插入/修改,完數據後,再修改表寫日誌:
sql> alter table table_name LOGGING;
d、沒有寫log, 速度會塊很多,但是也增加了風險,如果出現問題就不能恢復。 e,或 create table table_name nologging as (select * from ...);
2、drop掉索引約束之類的;
3、 使用直接插入的方式
insert/*+append+*/into tb_name select colnam1,colname2 from table_name;
a,資料庫處於歸檔模式:當表模式為logging狀態時,無論是否使用append模式,都會生成redo.當表模式為nologging狀態時,只有append模式,不會生成redo。
資料庫處於非歸檔模式:無論是在logging還是nologing的模式下,append的模式都不會生成redo,而no append模式下都會生成redo。
b,建議不要經常使用append,這樣表空間會一直在高水位上,除非你這個表只插不刪
c,在使用了append選項以後,insert數據會直接加到表的最後面,而不會在表的空閑塊中插入數據。
使用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方式是無效的。
原文鏈接:http://blog.sina.com.cn/s/blog_61cd89f60102e7gi.html 歸檔模式與非歸檔模式 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的邏輯時鐘,每一次提交數值都要增加。