關於 ORACLE 大資料量操作 的調優

2021-06-16 07:50:44 字數 2244 閱讀 4457

由於系統進入到壓力測試階段,需要準備大量資料來模擬測試環境,其中就牽涉到一些大的資料量的操作。以下是一些心得。

1.   如果需要對乙個大資料量的表進行全表更新,那是非常耗時的。那麼此時不如使用 create table_temp as (select b.x,b.y,b.z from table b )來代替update。

以下是幾種可以使用這種方法的場景:

a.  

假設表a有3個字段(x,y,z),其中y需要被全盤更新為乙個統一的值1

那麼可以這樣:

a.1  

先建立乙個a的臨時表a_temp   create table a_temp as select  t.x,1,t.z    from a t;

a.2   

然後把a表上的建立索引、主鍵一類的sql語句記錄下來

a.3  

然後drop掉a表,並且把a_temp表改名為a

a.4最後在a表上重建索引、主鍵

這兩者之間的效率相差數十倍。

2.  對大資料量操作的效率的調優

這裡以插入作為例子。我們大概需要插入36組量級為3000萬的資料,按照年和月進行翻倍,意思就是:其他所有的字段內容都不變,只有年月發生變化

按照一般情況下的調優,當然是建立乙個3000萬資料的臨時表,然後以這個臨時作為基礎資料,寫儲存過程,使用迴圈,不斷插入資料:

(假設b表是目標表,b_temp是我建立的包含了3000萬資料的臨時表,b的字段也有3個,x,y,z,其中y,z分別是年和月)

--------------------這樣寫的結果就是速度超慢---------------------------------------

create or replace procedure insert_p as

month integer;

year integer;

nowdate date := sysdate ;

begin

for c in 1..36 loop

select addmonths(nowdate ,1)  into nowdate from dual;

month :=to_number(to_char(nowdate,'mm'));

year :=to_number(to_char(nowdate,'yyyy'));

insert into b (x,y,z) select (x,year,month) from b_temp;

end loop;

end insert_p ;

然後,進入到資料庫所在機器,使用機器上自帶的sqlplus來執行這個儲存過程insert_p 

--------------------這樣寫的結果就是速度超慢---------------------------------------

所以,我們要開啟併發

簡單的說,就是使用多個cpu同時來寫(當然,前提是你有多個cpu)

啟動併發的步驟如下:

a.開啟,並調整表的並行度(值根據cpu的個數來定)

b.  

將表置為「無事件記錄」模式

c.   

調整會話的並行度

在sqlplus下敲入:alter session enable parallel dml;

d.  

在sql語句中新增 parallel引數,以及 nologging引數

create or replace procedure insert_p as

month integer;

year integer;

nowdate date := sysdate ;

begin

for c in 1..36 loop

select addmonths(nowdate ,1)  into nowdate from dual;

month :=to_number(to_char(nowdate,'mm'));

year :=to_number(to_char(nowdate,'yyyy'));

insert into

/*+ parallel (b,8) */  b  

nologging  (x,y,z) select

/*+ parallel (b_temp,8) */  x,year,month  from b_temp;

end loop;

end insert_p ;

綜上幾步,可以最大限度地使用已有的cpu,大幅提高執行效率。當然,寫的不對的請大家指正,並強烈期待有高手前來補充。

Oracle大資料量遷移

prompt 生成歷史表,使用nologging create table his test nologging as select from test prompt 檢驗新舊表的資料量是否一致 select count 1 from test select count 1 from his tes...

oracle中大資料量join操作的試驗

通過關聯訂購關係這個操作做了乙個關於join操作的試驗。以前採用上下行表直接關聯,2個表資料量大約是2200w左右和1400w左右,並且2個表都是屬於寬表,字段內容多,占用空間大,但join的時候用到的字段很少 2個左右 因此很多記憶體都耗在了儲存不必要的字段值。每次關聯操作耗時在2個小時以上。通過...

Oracle 大資料量下的資料遷移

本文主要描述了從oracle 9i至oracle 10g的單錶大資料量的遷移過程,其間作者嘗試了不同方法,對比之後,主要使用了db link。正文 由於公司伺服器公升級,原oracle 9i rac 裸裝置 系統也公升級到了oracle 10g rac asm 原資料庫中的資料也要匯入到新建的資料庫...