2013-10-24 65 views
1

數據庫:的Oracle 11g 服務器:GNU/Linux的 的Bash shell。執行,在並行使用SQL查詢的shell腳本 -

我已經開發使用的sqlplus連接到數據庫,然後從表的每一行,並更新了值的列的shell腳本。

我設計的這個,因爲我對這個表的數據非常少,但現在的數據已經增長到50萬行。選擇並更新每條記錄顯然需要很長時間來更新500K行。

有沒有一種方法,我可以並行執行的腳本,但每個腳本拿起唯一的記錄和更新的行?避免並行運行的腳本更新同一行?

+0

從理論上講,你應該能夠使用單個查詢做到這一點,儘管它很難說,因爲你不同意你的數據結構或當前腳本 –

+0

@CharlieMar我會嘗試發佈代碼,但邏輯很簡單,請從stagin_table中選擇dd_no,其中seq_num =&1;並在dd_no上調用dosomething並調用update staging_table set dd_no ='$ {dd_no}'其中seq_num =&1;希望這回答你的問題。期待您的回覆;靜候佳音。 – dicaprio

回答

2

你可以有一個腳本,需要在一個或多個參數和更新一行。然後你可以有另一個腳本在後臺迭代調用第一個腳本。例如:

updateRow.sh

!#/bin/bash 
firstParameter=$1 
secondParameter=$2 
# ...and so on 

# Update table based on input 

updateTable.sh

!#/bin/bash 
for i in 1 .. N 
do 
    $WORKING_DIR/updateRow.sh <param1> <param2> & > /path/to/log/file 
done 

你當然可以拿出不同的邏輯做同樣的事情。請注意,並行運行的腳本實例不會嘗試更新同一行。

+0

我喜歡這個想法。 – dicaprio

+0

爲了避免服務器過載和混合輸出,你可以使用GNU Parallel:parallel $ WORKING_DIR/updateRow.sh arg1 {} ::: {1..100} –

0

一個關於Oracle數據庫的好處之一是,你可以使用PLSQL(程序SQL),這是恰恰創造了這樣的遷移。我還不能肯定,我完全理解你的榜樣,但是我覺得你的腳本會是這個樣子......

spool name-of-log.log 

SET SERVEROUTPUT ON 
SET DEFINE OFF 
SET SCAN OFF 

-- Output the current schema and execution time for logging purposes 
SELECT USER 

    ||' @ ' 

    ||GLOBAL_NAME 

    || ' ' 

    || TO_CHAR(SYSDATE,'dd-MON-yy hh24:MI:ss') AS ENVIRONMENT 

from global_name; 

-- now your procedure.. 
DECLARE 
    -- declare any necessary variables (none needed in this example) 
BEGIN 
    FOR i IN 
    (SELECT dd_no, seq_num 
    FROM stagin_table) 
    LOOP 
    -- do something on i.dd_no, then.. 
    EXECUTE IMMEDIATE 'update staging_table set dd_no = ' || i.dd_no || ' where seq_num = ' || i.seq_num; 
    END LOOP; 
END; 
/

spool off; 

然後,只需執行用sqlplus腳本在你的shell腳本或命令行運行..

sqlplus>@my-script-name.sql 

從理論上講,這將是比調用多個shell腳本更快

+0

這裏有一個問題!我可以在PLSQL中做到這一點,但問題在於「在i.dd_no上做些什麼」。我無法對SQL中的i.dd_no做任何事情,原因是,我將直接解密不可能PLSQL的dd_no。我將不得不在shell腳本中調用第三方應用程序來解密,結果將存儲在$ dd_no中並用於update語句中。 – dicaprio

+0

對不起,我沒有意識到'做些什麼'是PLSQL無法做到的事情。但我不會低估PLSQL。有許多用於加密/解密的PLSQL函數,如果必須的話,你也可以隨時編寫自己的函數。您可以輕鬆找到更受歡迎的方法的算法示例。這是Google搜索的第一個結果。 http://www.oracleflash.com/41/Encrypt-or-Decrypt-sensitive-data-using-PLSQL---DBMS_CRYPTO.html –

+0

我同意你的意見,但這是應用程序級加密。儘管它使用AES,但無法在SQL中完成。我在這裏雙重檢查了Application Arch,他們說,我們必須調用API來解密。 Perl會有所幫助,但是在生產中沒有安裝DBI perl。 – dicaprio