【问题标题】:SAP HANA | BULK INSERT in SAP HANASAP HANA | SAP HANA 中的批量插入
【发布时间】:2019-01-20 08:34:00
【问题描述】:

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

【问题讨论】:

  • 这个批处理构造的原因是什么?您的系统是否缺乏资源来支持简单的INSERT ...(SELECT ...))?另外,您是否以任何方式在数据加载期间控制目标表的增量合并?
  • 您考虑过EXPORT/IMPORT SQL 语句吗?可能不太理想,但 il 允许您管理线程、锁等?缺点是您将在服务器上物理创建一个文件,但运行没有数据的导出将允许您摆脱它(如果我没记错的话)。
  • @LarsBr。如果我在单个语句中插入,插入2.2亿条记录后会不会Delta合并导致大量重做日志和巨大的内存消耗
  • 您需要所有列吗?而不是所有列都使用“*”,也许您只能将所需的数据复制到目标表中。
  • @Eralper t_rst 仅包含必需的列

标签: sap bulkinsert hana


【解决方案1】:

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

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

BEGIN PARALLEL EXECUTION 
   <stmt> 
END;

请参考reference documentation

计算出 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

【讨论】:

  • 这将不起作用,因为插入的目标是 same 表。这对于 PARALLEL 块 DML 是明确不允许的。 (help.sap.com/viewer/de2486ee947e43e684d39702027f8a94/2.0.03/…)
  • @LarsBr.&@Eralper 如果我对目标表进行分区并将数据加载到不同的分区中,它会起作用
  • 感谢您的回复,我添加了限制,以防止在这种情况下使用并行执行。我们可以并行执行插入同一张表的不同分区吗?
  • 是的,并行插入/更新到不同的分区是可能的,您甚至不需要为此使用显式并行子句。只需运行单个 INSERT INTO (SELECT...) 即可并行化编写部分。
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多