sap - 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 行。
解决方案
正如 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
推荐阅读
- revit-api - 在 pyrevit 中运行 python 脚本时是否可以继续在 Revit 中工作?
- azure-active-directory - 如何从微软团队中获取团队成员和所有者?
- node.js - 无法通过节点邮件程序发送邮件。错误:在端口 25 处连接 ECONNREFUSED"
- javascript - 来自 MongoDB 的错误消息“操作 `disneys.insertOne()` 缓冲在 10000 毫秒后超时”
- artificial-intelligence - 如何在 Clips 中创建可分规则?
- javascript - 下载在 MS Teams 选项卡中生成的文件
- php - 如何为选择输入动态设置数组选项
- android - 为共享元素回调添加侦听器而不更改视图可见性
- bash - IntelliJ IDEA 中“在终端中执行”选项的意义
- get - 如何从固定位置恢复winscp中的大文件下载