時間:2020-05-16來源:電腦系統城作者:電腦系統城
當需要對一個非常大的表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 如下:
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方式是無效的。
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的邏輯時鐘,每一次提交數值都要增加。
2022-03-09
sql語句中union的用法與踩坑記錄2022-03-05
MSSQL 附加數據庫提示“錯誤 823”數據恢復實操2022-03-05
sqlserver數據庫加密后無法使用MDF,LDF,log文件名稱被修改的數據恢復交叉聯接(cross join)的概念 2、交叉聯接的語法格式 3、交叉查詢的使用場景 3.1 交叉聯接可以查詢全部數據 3.2 交叉聯接優化查詢性能...
2021-04-22