2015-11-06 41 views
0

我有一張大量數據的表格。它按周分區。該表包含名爲group的列。每個group可能有多個星期的記錄。例如:如何加速從按日期分區的表創建表?

列表項

gr week data 
    1  1 10 
    1  2 13 
    1  3  5 
    .  .  6 
    2  2 14 
    2  3 55 
    .  .  . 

我想創建基於一個group表。目前創建Oracle 11g需要大約23分鐘。這是很長一段時間,因爲我必須重複每個組的過程,並且我有很多組。什麼是創建表的最快捷方式?

+0

你需要兩個表中的數據 - 源和目的地嗎?或者您將在複製之後從源表中刪除數據? – Tatiana

+0

您需要提供更多詳細信息。你究竟如何創建「基於一個組的表格」?什麼是「巨大」的數據量?表和索引定義是什麼?就目前來看,這個問題是無法回答的。 – mustaccio

+0

是的,我需要兩個。事實上,源表是物理表,目標表是臨時表,在使用存儲的數據後將被刪除。 –

回答

0

創建所有的表,然後使用INSERT ALL當 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm#i2145081

的數據將只能讀取一次。

insert all 
    when gr=1 then 
    into tab1 values (gr, week, data) 
    when gr=2 then 
    into tab2 values (gr, week, data) 
    when gr=3 then 
    into tab3 values (gr, week, data) 
select * 
from big_table 
+0

謝謝你的迴應。問題是我正在處理大約30億條記錄,我會打擊表空間。我必須從一個組創建一個表,當我完成了該組的工作後,我刪除表併爲不同的組創建表等等。還有其他建議嗎? –

0

最好的提速到達,如果你不復制組的基礎和工藝上的數據,然後按周,但你不說你會到達什麼,所以這是不可能發表評論(此方法可能當然困難或不切實際;但你至少應該考慮它)。

因此下面的一些提示如何提取組數據:

  • 刪除所有索引,因爲這隻會塊空間 - 所有你需要做的是一個大的全表掃描

  • 檢查每個組的可用空間和大小;也許你可以一次

  • 部署並行查詢

處理若干組。

create table tmp as 
select /*+ parallel(4) */ * from BIG_TABLE 
where group_id in (..list of groupIds..); 

請注意,必須在數據庫中啓用並行模式,如果您不確定,請諮詢您的DBA。重點是大型FULL TABLE SCAN由幾個子過程(這裏是4)執行,這可能(取決於你的里程數)縮短了經過的時間。

+0

謝謝Marmite。我已經測試過你的第一種方法,它「容易得多,但不幸的是,我沒有太多的空間來做這件事,每週都會創建所有的組。爲一個選定的組創建一週將花費大約1分鐘,而我有104周,這意味着1小時半(我正在創建一個進程,允許運行的時間不會超過36小時)至於第二種方法,它是值得仔細考慮,我必須明天測試以檢查性能 –

+0

祝你好運,讓我們知道我們是否可以提供幫助。 –