oracle交換分割槽對資料的載入提速案例

2022-04-08 02:59:10 字數 2988 閱讀 6317

oracle交換分割槽對資料的載入提速案例

環境:os:linux

db:oracle10g

www.2cto.com  

其中乙個庫的資料載入非常慢,如何能提高資料的載入速度呢?下面是乙個小例子。

首先統計載入資料表所涉及的sql,這是做下面的基礎。

使用表tabname1的sql如下幾個:

select count(*)

from (select rpl.itemcode, rpl.catalogid

from tabname rpl

where rpl.l3column = :1

and rpl.supplierid = :2

and rpl.statdate = to_date(sysdate-2, 'yyyy-mm-dd')

group by (rpl.catalogid, rpl.itemcode)) temp

select sum(listnum) as lsum, sum(clicknum) as csum

from tabname rpl

where rpl.l3column = :1

and rpl.supplierid = :2

and rpl.statdate = to_date(:3, 'yyyy-mm-dd')

www.2cto.com  

select tmpb.*

from (select tmpa.*, rownum rownum_

from (select temp.lsum,

temp.csum,

temp.itemcode,

temp.catalogid,

rpo.ordernum,

rpo.order_pro_num,

temp.productid

from (select sum(listnum) as lsum,

sum(clicknum) as csum,

rpl.itemcode,

rpl.catalogid,

rpl.productid

from tabname1 rpl

where rpl.l3column = :1

and rpl.supplierid = :2

and (rpl.catalogid like '015%' or

rpl.catalogid like '15%')

and rpl.statdate = to_date(:3, 'yyyy-mm-dd')

group by (rpl.catalogid, rpl.itemcode, rpl.productid)) temp

left join tabname3 rpo

on temp.itemcode = rpo.itemcode

and rpo.statdate = to_date(:4, 'yyyy-mm-dd')

order by lsum desc, temp.itemcode) tmpa

where rownum <= :5) tmpb

where tmpb.rownum_ > :6

www.2cto.com  

select tcc.description

from tabname1 rpl, tabname2 tcc

where rpl.country = tcc.countryid

and rpl.l3column = :1

and rpl.supplierid = :2

and rpl.itemcode = :3

and rpl.statdate = to_date(:4, 'yyyy-mm-dd')

and rownum <= :5

order by rpl.listnum desc

通過以上sql可以看到,都是對資料某一天的統計,這些sql也是主要影響db磁碟的io的,所以建議調整tabname1的分割槽格式,採用rang-list組合分割槽;只建立分割槽索引,不建立全域性索引。以statdate列建立rang分割槽,以l3column建立list分割槽

目前load資料邏輯:

1. 每天先truancate表tmp_tabname1,

2. 然後gp集群把這一天的所有資料都load到tmp_tabname1,

3. 然後再把tmp_tabname1 直接insert到表tabname1;速度主要慢在insert的過程。(可以按l3column把資料分配load到tmp_tabname1)

調整後load資料邏輯:

1. 每天先truancate表tmp_tabname1, 

2. 然後gp集群把這一天的每個list(l3column)資料分別load到tmp_tabname1,也就是說gp集群把原來一次load變為1000次,或者tmp_tabname1的分割槽和tabname1一樣,這樣gp集群也是一次load

3. 利用oracle的表交換技術(eg:alter table t_temp exchange subpartition p9sublist1 with table t_temp1 update indexes)來提高資料load到tabname1的速度

我測試用表交換技術和insert的load資料對比

資料量:300m,1700萬記錄的測試資料

用表交換(有全域性索引的),速度比insert快2倍左右

用表交換(沒有有全域性索引的),速度比insert快4-6倍左右

www.2cto.com  

這樣做的好處,因為db的io瓶頸很嚴重,io的utile%幾乎很少低於95%的

1. 提高查詢速度,sql根據statdate找到rang主分割槽,然後再根據l3column找到list分割槽,這樣就減少了資料掃瞄的資料量

2. 加快了load的速度

3. 便於維護

缺點:1.gp集群到tmp_tabname1的load速度有影響

可以根據自己業務需求來選擇合適實現方式,選擇適合自己的就是最好的!!!

------end------  

作者 skate

Oracle中對數字加漢字的排序

需求 有一列name,varchar2型別,內容如下 以上就是已經按order by name進行排序的,但不是我們想要的結果 現在需要只按數字進行排序 第一步 抽取數字 由於數字有是一位的有是兩位的 所以不好用substr進行擷取 我們可以使用regexp substr函式,使用正規表示式從字串中...

分割槽資料交換

資料交換表面看上去是兩個段裡面的資料進行交換,其實就是資料字典的交換,但是表結構必須一樣 下面乙個例子交換分割槽和索引 建立分割槽 create table part index example x number y number,data varchar2 20 partition by rang...

Oracle資料分割槽

範圍分割槽 範圍分割槽就是對資料表中的某個值的範圍進行分割槽,根據某個值的範圍,決定將該資料儲存在哪個分割槽上。如根據序號分割槽,根據業務記錄的建立日期進行分割槽等 create table subarea pid number not null,pitem varchar2 200 pdata d...