从内部表更新数据库表

2020-08-22 05:13发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


以下两个解决方案具有相同的结果。 我的问题是:

1。 哪个更好?

2。 如果我们处理大量数据,如何调整性能?

解决方案1:

...

在mt_person_data分配LOOP AT

...

-时间戳= ....

-聚合= abap_true。

ENDLOOP。

更新/iwfnd/person_data表mt_person_data中指定的客户端。
ASSERT sy-subrc = 0。

提交工作。

...

解决方案2:

...

在mt_person_data INTO ls_person_data中循环。

更新/iwfnd/person_data客户端指定

SET汇总= ls_person_data汇总
时间戳= ls_person_data时间戳

mandt = ls_person_data-mandt

AND id = ls_person_data-id。

ASSERT sy-subrc =0。
ENDLOOP。

提交工作。

...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


以下两个解决方案具有相同的结果。 我的问题是:

1。 哪个更好?

2。 如果我们处理大量数据,如何调整性能?

解决方案1:

...

在mt_person_data分配LOOP AT

...

-时间戳= ....

-聚合= abap_true。

ENDLOOP。

更新/iwfnd/person_data表mt_person_data中指定的客户端。
ASSERT sy-subrc = 0。

提交工作。

...

解决方案2:

...

在mt_person_data INTO ls_person_data中循环。

更新/iwfnd/person_data客户端指定

SET汇总= ls_person_data汇总
时间戳= ls_person_data时间戳

mandt = ls_person_data-mandt

AND id = ls_person_data-id。

ASSERT sy-subrc =0。
ENDLOOP。

提交工作。

...

付费偷看设置
发送
4条回答
粗暴的香蕉
1楼 · 2020-08-22 05:33.采纳回答

您好 Andy Yen

这取决于表结构和数据量:

解决方案1会将itab mt_person_data的所有数据传输到数据库服务器,并更新给定键的/iwfnd/person_data的所有字段,以及所有依存索引,即使值没有改变!

因此,如果表中只有很少的记录和字段,并且没有其他索引,则可能会很好。

使用解决方案2可以减少数据传输,只有必要的DB字段可以更改,并且可能触发索引更新。 另外,您可以更改COMMIT处理以支持包处理(例如,每20条记录提交一次)。

致谢

Domi

风早神人
2楼-- · 2020-08-22 05:22

您忘记了更新行 row表示需要为每一行建立一个数据库连接,而不是为选项1进行一次连接。如果要更新的数据量很大,则建议的执行速度会变慢。

闻人可可
3楼-- · 2020-08-22 05:43

I 出于性能方面的原因,总是喜欢批量更新(仅开销一次)。 在我看来,它的唯一缺点是预先记录。 如果有错误,则无法告诉用户哪个Set导致了错误。

我现在无法查看系统,但是没有选项TRANSFERING或类似于"仅更新某些列"的选项吗? 可以与批量更新一起使用。

SAP小黑
4楼-- · 2020-08-22 05:36

解决方案2更好:

因为您是从工作区逐行更新数据库表...

解决方案1:从内部表更新数据库表... \

这可能会降低性能问题...可能是内部表中包含大量数据...

一周热门 更多>