数据库:Oracle 11g 服务器:GNU/Linux Bash Shell。
我开发了一个使用 sqlplus 连接到数据库并从表中选择每一行并使用值更新列的 shell 脚本。
我之所以设计这个,是因为该表上的数据很少,但现在数据已经增长到 500K 行。选择和更新每条记录显然需要很长时间来更新 500K 行。
有没有办法可以并行执行脚本,但每个脚本都会获取唯一记录并更新行?避免通过并行运行的脚本更新同一行?
您可以有一个脚本,它接收一个或多个参数并更新一行。然后,您可以有另一个脚本在后台迭代地调用第一个脚本。例如:
更新行
!#/bin/bash
firstParameter=$1
secondParameter=$2
# ...and so on
# Update table based on input
更新表.sh
!#/bin/bash
for i in 1 .. N
do
$WORKING_DIR/updateRow.sh <param1> <param2> & > /path/to/log/file
done
你当然可以想出不同的逻辑来做同样的事情。请注意并行运行的脚本实例不要尝试更新同一行。
Oracle 数据库的优点之一是您可以使用 PLSQL(Procedural 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脚本更快