如何加速Oracle大批量資料處理

2021-09-30 10:41:01 字數 4579 閱讀 5302

如何加速oracle大批量資料處理

一、           提高dml操作的辦法:

簡單說來:

1、暫停索引,更新後恢復.避免在更新的過程中涉及到索引的重建.

2、批量更新,每更新一些記錄後及時進行提交動作.避免大量占用回滾段和或臨時表空間.

3、建立一臨時的大的表空間用來應對這些更新動作.

4、批量更新,每更新一些記錄後及時進行提交動作.避免大量占用回滾段和或臨時表空間.

5、建立一臨時的大的表空間用來應對這些更新動作.

6、加大排序緩衝區

alter session set sort_area_size=100000000;

insert into tableb select * from tablea;

commit;

如果update的是索引字段,就會涉及到索引的重建,暫停索引不會提高多少的速度,反而有可能降低update速度,

因為在更新是索引可以提高資料的查詢速度,重建索引引起的速度降低影響不大。

oracle優化修改引數最多也只能把效能提高15%,大部分都是sql語句的優化!

update總體來說比insert要慢 :

幾點建議:  

1、如果更新的資料量接近整個表,就不應該使用index而應該採用全表掃瞄  

2、減少不必要的index,因為update表通常需要update index  

3、如果你的伺服器有多個cpu,採用parellel hint,可以大幅度的提高效率

另外,建表的引數非常重要,對於更新非常頻繁的表,建議加大pctfree的值,以保證資料塊中有足夠的空間用於update, 從而降低chained_rows。

二、各種批量dml操作:

(1)、oracle批量拷貝:

set arraysize 20

set copycommit 5000

copy from

username/password@oraclename

(2)、常規插入方式:

insert into t1 select * from t;

為了提高速度可以使用下面方法,來減少插入過程中產生的日誌:

alter table t1 nologging;

insert into t1 select * from t;

commit;

(3)、ctas方式:

create table t1

asselect * from t;

為了提高速度可以使用下面方法,來減少插入過程中產生的日誌,並且可以制定並行度:

create table t1 nologging parallel(degree 2) as select * from t;

(4)、direct-path插入:

commit;

為了提高速度可以使用下面方法,來減少插入過程中產生的日誌:

alter table t1 nologging;

direct-path插入特點:

1、

只在

insert … select …

中起作用,像

這類的語句是不起作用的。在

update

、delete

操作中,

也不起作用。

2、direct-path

會使資料庫不記錄直接路徑匯入的資料的重做日誌,會對恢復帶來麻煩。

3、direct-path

直接在表段的高水位線以上的空白資料塊中寫資料,不會重用高水位線以下的空間,會對空間的使用造成一定的浪費,對查詢的效能也會造成一定的影響。而常規插入會優先考慮使用高水位線之下有空閒空間存在的資料塊。因此理論上

direct-path

插入會比常規插入速度更快,因為

direct-path

直接使用新資料塊,而常規插入要遍歷

freelist

獲取可用空閒資料塊,如果

同nologging

配合,這種速度優勢會更加明顯。

4、

方式插入記錄後,要執行

commit

,才能對錶進行查詢。否則會出現錯誤:

ora-12838:

無法在並行模式下修改之後讀

/修改物件。

5、

匯入資料後,如果沒有提交或者回滾,在其他會話中任何對該錶的

dml都會被阻塞(不會報錯),但對該錶的查詢可以正常執行。

6、在歸檔模式下,要把表設定為

nologging

,然後以

方式批量新增記錄,才會顯著減少

redo

數量。在非歸檔模式下,不必設定表的

nologging

屬性,即可減少

redo

數量。如果表上有索引,則

方式批量新增記錄,不會減少索引上產生的

redo

數量,索引上的

redo

數量可能比表的

redo

數量還要大。

7、資料直接插入資料檔案,繞過

buffer cache

並且忽略了引用完整性約束。

8、不管表是否在

nologging

下,只要是

direct  insert

,就不會對資料內容生成

undo

9、oracle

在direct-path insert

操作末尾,對具有索引的表執行索引維護,這樣就避免了在

drop

掉索引後,再

rebuild

10、direct-path insert比常規的插入需要更多的空間。因為它將資料插入在高水位之上。並行插入非分割槽表需要更多的空間,因為它需要為每乙個並行執行緒建立臨時段。

11、在插入期間,資料庫在表上獲得排他鎖,使用者不能在表上執行並行插入、更新或者刪除操作,並行的索引建立和build也不被允許。但卻可以並行查詢,但查詢返回的是插入之前的結果集。

(5)、並行dml:

如果你的伺服器有多個cpu,採用parellel hint,可以大幅度的提高效率

alter session enable parallel dml;

insert /*+ parallel(tablea, 2) */into tablea

select * from tableb;

為了提高速度可以使用下面方法,來減少插入過程中產生的日誌:

insert /*+ parallel(tablea, 2) */into tablea nologging

select * from tableb;

oracle預設並不會開啟pdml,對dml語句必須手工啟用。即需要執行

alter table enable parallel dml命令。

並行dml特點:

1、在並行dml模式中,預設的就是direct-path插入,為了執行並行dml模式,必須滿足以下條件:

a、必須是oracle企業版;

b、必須在session中使並行dml生效,執行以下sql語句:

alter session parallel dml;

c、必須指定table的並行屬性,在建立的時候或者其他時候,或者在insert操作時使用「parallel」提示。

2、並行direct-path insert到分割槽表:

類似於serial direct-path insert,每個並行操作分配給乙個或者多個分割槽,每個並行操作插入資料到各自的分割槽段的高水位標誌之上,commit之後,使用者就能看到更新的資料。

3、並行direct-path insert到非分割槽表:

每個並行執行分配乙個新的臨時段,並插入資料到臨時段。當commit執行後,並行執行協調者合併新的臨時段到主表段,使用者就能看到更新的資料。

4、direct-path insert可以使用log或者不使用log。

5、另外不得不說的是,並行不是乙個可擴充套件的特性,只有在資料倉儲或作為dba等少數人的工具在批量資料操作時利於充分利用資源,而在oltp環境下使用並行需要非常謹慎。事實上pdml還是有比較多的限制的,例如不支援觸發器,引用約束,高階複製和分布式事務等特性,同時也會帶來額外的空間占用,pddl同 樣是如此。

如何加速Oracle大批量資料處理

一 提高dml操作的辦法 簡單說來 暫停索引,更新後恢復.避免在更新的過程中涉及到索引的重建.批量更新,每更新一些記錄後及時進行提交動作.避免大量占用回滾段和或臨時表空間.建立一臨時的大的表空間用來應對這些更新動作 4 批量更新,每更新一些記錄後及時進行提交動作.避免大量占用回滾段和或臨時表空間.5...

如何加速Oracle大批量資料處理

一 提高dml操作的辦法 簡單說來 暫停索引,更新後恢復.避免在更新的過程中涉及到索引的重建.批量更新,每更新一些記錄後及時進行提交動作.避免大量占用回滾段和或臨時表空間.建立一臨時的大的表空間用來應對這些更新動作 5 加大排序緩衝區 alter session set sort area size...

oracle中插入大批量資料

方法一 建立乙個表,並同時新增1000000條資料,create table testtable as select rownum as id,to char sysdate rownum 24 3600,yyyy mm dd hh24 mi ss as inc datetime,trunc dbm...