我们有SAP HANA 1.0 SP11。我们有一项要求,需要每天计算商店的当前库存,物料水平。预计行数不超过2.5亿。
目前,我们使用相同的程序。程序流程如下-
begin
t_rst = select * from <LOGIC of deriving current stock on tables MARD,MARC,MBEW>;
select count(*) into v_cnt from :t_rst;
v_loop = v_cnt/2500000;
FOR X in 0 .. v_loop DO
INSERT INTO CRRENT_STOCK_TABLE
SELECT * FROM :t_rst LIMIT 2500000 OFFSET :count;
COMMIT;
count := count + 2500000;
END FOR;
end;
结果集t_rst
的行数约为 2.5亿。
过程时间的总执行时间为约2.5小时。很少有过程会进入长时间运行状态,从而导致错误。我们在非高峰时段运行此过程,因此系统负担几乎没有。
有没有办法,我们可以在并行线程中将数据加载到目标表中并减少加载时间。此外,是否可以有效地在HANA中批量插入。
查询t_rst将在5分钟内获取前1000行。
答案 0 :(得分:0)
如Lars所述,总资源使用率不会有效改变
但是如果您的时间有限(非高峰时间),并且系统配置可以克服并行执行的要求,那么您可以尝试使用
BEGIN PARALLEL EXECUTION
<stmt>
END;
计算v_loop值后,您知道必须按照INSERT命令运行多少次
INSERT INTO CRRENT_STOCK_TABLE
SELECT * FROM :t_rst LIMIT 2500000 OFFSET :count;
我不确定如何将上述代码转换为用于并行执行的动态计算
但是您可以假设有10个并行进程,并根据计算出的值修改OFFSET子句来运行那么多INSERT命令
超出的行将运行零行,这不会损害整个过程
作为对@LarsBr的回应。 ,正如他所提到的,有一些限制会阻止并行执行
限制和限制
以下限制适用:
Modification of tables with a foreign key or triggers are not allowed
Updating the same table in different statements is not allowed
Only concurrent reads on one table are allowed. Implicit SELECT and SELCT INTO scalar variable statements are supported.
Calling procedures containing dynamic SQL (for example, EXEC, EXECUTE IMMEDIATE) is not supported in parallel blocks
Mixing read-only procedure calls and read-write procedure calls in a parallel block is not allowed.
这些局限性在于,无法从不同的执行方式插入同一张表,也无法使用动态SQL