1

我负责一个上传 ABAP 生成的平面文件的系统。我们每天都会从 SAP 的 HR 模块生成一个大文件(500,000 条记录),它会为每个人生成下一年的记录。如果一个人在某一天被轮班或计划在某一天休假,他们就会获得记录。

这项工作需要 8 多个小时才能运行,并且开始变得时间紧迫。我不是 ABAP 程序员,但在与程序员讨论这个问题时我很担心,因为他们一直在提到“循环”。

查看源代码,它只是嵌套循环后嵌套循环内的一堆单行选择。不仅它有大量的SELECT

我向程序员建议他们更多地使用 SQL,但他们坚持 SAP 认可的方式是使用循环而不是 SQL,并使用提供的 SAP 函数(即查找工作计划规则),并且使用 SQL 会更慢。

作为一名数据库程序员,我从不使用循环(游标),因为它们比 SQL 慢得多,而且游标通常是程序程序员在数据库上松懈的赠品。

我简直不敢相信将现有程序更改为比循环更频繁地使用 SQL 会减慢它的速度。有没有人有任何见解?如果需要,我可以提供更多信息。

看看谷歌,我猜我会让双方的人都说它更好。

4

3 回答 3

2

我读过这个问题,当我读到这个时我停了下来:

查看源代码,它只是嵌套循环后嵌套循环内的一堆单行选择。不仅它有大量的 SELECT *。

如果不了解更多关于这个问题的信息,这看起来有点过头了,因为在每个循环中,程序都会执行对数据库的调用。也许这样做是因为所选数据的数据集太大,但是可以加载数据块,然后处理它们,然后重复操作,或者您可以进行大 JOIN 并对该数据进行操作。这有点棘手,但相信我,这可以完成工作。

在 SAP 中,当这种情况发生时,您必须使用这种技术。没有什么比在内存中处理数据集更有效的了。为此,我可以推荐使用排序和/或散列表和 BINARY SEARCH。

另一方面,使用 JOIN 并不一定会提高性能,它取决于对表中索引和外键的了解和使用。例如,如果您加入一个表以获取描述,我认为最好将该数据加载到内部表中并使用 BINARY SEARCH 从中获取描述。

我不能确切地说出公式是什么,这取决于具体情况,大多数时候您必须调整代码、调试和测试,并使用事务“ST05”和“SE30”来检查性能并重复该过程. 在 SAP 中处理这些问题的经验让您清楚地了解这些模式。

我对您的最佳建议是复制该程序并根据您的经验进行更正。您描述的代码肯定可以改进。你能放出什么?

希望能帮助到你

于 2015-07-27T13:53:32.527 回答
1

你是对的。

在不了解代码的情况下,在大多数情况下,使用视图或连接而不是嵌套循环要快得多。(有例外,但非常罕见)。

您可以在 SE11 或 SE80 中定义视图,它们通常会大大减少 abap 服务器和数据库服务器之间的通信开销。

通常情况下,SAP 会为常见情况提供易于定义的视图。

编辑:

你可以检查你的表现去哪里:http ://scn.sap.com/community/abap/testing-and-troubleshooting/blog/2007/11/13/the-abap-runtime-trace-se30--quick-和-容易

很少使用的写得不好的部分无关紧要。

有了统计数据,您就知道优化工作在哪里受到了伤害。

于 2015-07-27T12:36:40.357 回答
1

听起来像现在的导入正在循环单个记录并一次将它们导入数据库。那里很可能有很多冗余。这是我见过很多次的模式,我们采用的通用解决方案是批量导入数据......

SQL Server 存储过程可以接受“表”类型的参数,这些参数在数据库连接的客户端/C# 端是与表结构相对应的某些数据结构的简单列表。

然后,存储过程可以在一次调用中接收和处理 csv 文件的多行,因此您需要做的任何连接都是在输入数据集上完成的,这就是关系数据库的设计用途。如果您要加入常用数据或有大量外键(本质上是调用联接以验证您尝试插入的键),这将特别有用。

我们发现,使用这种方法可以大大减少给定数量的导入数据的 SQL Server CPU 和 IO 负载。但是,它确实需要咨询 DBA 并调整索引以使其正常工作。

于 2015-07-27T11:16:10.910 回答