2013-10-24 130 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