我们有SAPHANA1.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行。
发布于 2019-01-22 05:58:04
正如Lars所指出的,总资源的使用不会有效地改变。
但是,如果您有有限的时间(非高峰时间),如果系统配置将克服并行执行的要求,也许您可以尝试使用
BEGIN PARALLEL EXECUTION
<stmt>
END;请参阅参考文献
计算v_loop值之后,您知道必须按照INSERT命令运行多少次
INSERT INTO CRRENT_STOCK_TABLE
SELECT * FROM :t_rst LIMIT 2500000 OFFSET :count;我不知道如何将上述代码转换为并行执行的动态计算。
但是您可以假设我们假设有10个并行进程,并根据计算值修改偏移子句来运行多个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。
https://stackoverflow.com/questions/54274795
复制相似问题