2013-08-05 49 views
0

我有一個沉重的查詢,它將數據後臺打印到發送給用戶的csv文件中。我手動進行了並行會話,並使用篩選條件執行查詢,以便我可以將所有後臺處理後的文件加入到單個文件中,從而減少生成數據的時間(通常需要大約10個小時,並行會話需要花費2.5-3小時)。Oracle SQL自動並行假脫機

我的查詢是如何自動執行此操作,腳本會找出max(agreementid),然後將其分發到X個假脫機調用中以生成X個文件,其中每個文件最多有100000條記錄。

附加說明:我想我的問題不是很清楚。我會再試一次並解釋。

  1. 我有一個表/視圖與大量的數據。
  2. 我需要將這些數據轉換爲CSV文件。
  3. 需要花費大量的時間來後臺處理CSV文件。
  4. 我通過下面的方式運行平行線軸。 a)選擇.... from ... where agreementid between 1 to 1000000; b)選擇....從...在1000001到2000000之間agreementid; 等,然後在多個會話中分別對其進行假脫機。
  5. 這有助於我生成多個文件,然後我可以拼寫在一起並與用戶分享。
  6. 我需要一個腳本(我猜是基於dos還是基於AIX),它將從我的表中找到agreementID的最小值和最大值,並自動創建假脫機腳本,並通過單獨的sql會話執行它們,以便自動生成文件。

不知道我是否可以讓自己清楚。 感謝球員回覆我先前的查詢,但那不是我正在看的。

回答

2

有點不清楚你想要什麼,但我想你想要一個查詢來找到x組的id(bucket)的低/高範圍agreement_ids。如果是這樣,你可以試試(使用4桶在這個例子中):

select bucket, min(agreement_id), max(agreement_id), count(1) 
from (
    select agreement_id, ntile(4) over (order by agreement_id) bucket 
    from my_table 
) 
group by bucket; 

編輯:如果你的問題是在後臺處理多個查詢,並結合搞亂,我寧願選擇創建一個物化視圖(使用並行在驅動表上的底層查詢中),並在需要時刷新(complete,atomic_refresh => false)。一旦刷新,只需從快照表中提取(以csv或任何您想要的格式)。

1

有可能是一個更簡單的方法,但這種生成ID的四個「桶」,你可以插上最小值和最大值爲您的參數化的篩選條件:

select bucket, min(agreementid) as min_id, max(agreementid) as max_id 
from (
    select agreementid, 
     case when rn between 1 and cn/4 then 1 
      when rn between (cn/4) - 1 and 2 * (cn/4) then 2 
      when rn between (2 * cn/4) - 1 and 3 * (cn/4) then 3 
      when rn between (3 * cn/4) - 1 and cn then 4 
     end as bucket 
    from (
     select agreementid, rank() over (order by agreementid) as rn, 
      count(*) over() as cn from agreements 
    ) 
) 
group by bucket; 

如果你想要一個上限每個桶而不是一個固定數量的桶,那麼你可以這樣做:

select floor(rn/100000), min(agreementid) as min_id, max(service_num) as max_id 
from (
    select agreementid, rank() over (order by agreementid) as rn 
    from agreements 
) 
group by floor(rn/100000); 

,然後將每個最小值/最大值傳遞到SQL腳本,如來自調用SQL * Plus的shell腳本。存儲桶編號也可以通過位置參數傳遞,並用作假脫機文件名稱的一部分。

我很好奇你已經確定爲瓶頸;你有沒有嘗試在數據庫中作爲並行查詢運行它,提示/*+ PARALLEL */

+0

謝謝,我會嘗試這兩種方法。 – user1859050