执行并行使用sql查询的shell脚本 -

时间:2013-10-24 16:21:52

标签: sql shell

数据库:Oracle 11g 服务器:GNU / Linux Bash Shell。

我开发了一个shell脚本,它使用sqlplus连接到数据库并从表中选择每一行并使用值更新列。

我设计了这个,因为我在该表上的数据非常少,但现在数据已经增长到500K行。选择并更新每条记录显然需要很长时间才能更新500K行。

有没有办法可以并行执行脚本,但每个脚本都会获取唯一记录并更新行?避免由并行运行的脚本更新同一行?

2 个答案:

答案 0 :(得分: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

你当然可以提出不同的逻辑来做同样的事情。请注意,并行运行的脚本实例不会尝试更新同一行。

答案 1 :(得分: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;

然后只需在shell脚本中使用sqlplus执行脚本,或者从命令行运行它。

sqlplus>@my-script-name.sql

理论上,这比调用多个shell脚本更快