由於系統進入到壓力測試階段,需要準備大量資料來模擬測試環境,其中就牽涉到一些大的資料量的操作。以下是一些心得。
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 原資料庫中的資料也要匯入到新建的資料庫...