首页 > 解决方案 > SAP HANA | SAP HANA 中的批量插入

问题描述

我们有 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 行。

标签: sapbulkinserthana

解决方案


正如 Lars 所说,总资源使用量不会有效改变

但是如果你的时间有限(非高峰时间)并且如果系统配置将克服并行执行的要求,也许你可以尝试使用

BEGIN PARALLEL EXECUTION 
   <stmt> 
END;

请参考参考文档

计算 v_loop 值后,您就知道必须按照 INSERT 命令运行多少次

INSERT INTO CRRENT_STOCK_TABLE
SELECT * FROM :t_rst LIMIT 2500000 OFFSET :count;

我不确定如何将上述代码转换为 PARALLEL EXECUTION 的动态计算

但是您可以假设假设有 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


推荐阅读