系統城裝機大師 - 唯一官網:www.farandoo.com!

當前位置:首頁 > 數據庫 > MsSql > 詳細頁面

oracle快速向表插入大量數據

時間:2020-05-16來源:電腦系統城作者:電腦系統城

oracle快速向表插入大量數據

   當需要對一個非常大的表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 NOLOGGING; 
            插入/修改,完數據后,再修改表寫日志:  
            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的邏輯時鐘,每一次提交數值都要增加。

分享到:

相關信息

系統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門系統下載

jlzzjlzz亚洲乱熟在线播放