繁体   English   中英

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

[英]Execute shell script that use sql query in parallel -

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

我已经开发了一个外壳程序脚本,该脚本使用sqlplus连接到数据库,并从表中选择每一行并用值更新一列。

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

有没有一种方法可以并行执行脚本,但是每个脚本都选择唯一的记录并更新行? 避免通过并行运行的脚本更新同一行?

您可能有一个脚本,它接受一个或多个参数并更新一行。 然后,您可以拥有另一个脚本,该脚本在后台迭代调用第一个脚本。 例如:

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

您当然可以想出不同的逻辑来完成相同的事情。 请注意,并行运行的脚本实例不要尝试更新同一行。

关于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执行脚本,或从命令行运行它即可。

sqlplus>@my-script-name.sql

从理论上讲,这比调用多个shell脚本要快

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM