数据导出性能问题 - 循环或连接?

时间:2015-07-27 09:57:00

标签: performance sap abap

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

这项工作需要8个多小时才能完成,并且开始变得时间紧迫。我不是ABAP程序员,但在与程序员讨论时我很担心,因为他们不断提及'循环'

查看源代码,它在嵌套循环之后只是嵌套循环中的一堆单行选择。它不仅具有 SELECT *

的负载

我向程序员建议他们更多地使用SQL,但他们坚持认为SAP批准的方法是使用循环而不是SQL并使用提供的SAP功能(即查找工作计划规则),并且使用SQL将慢一点。

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

我无法相信更改现有程序以比循环更重要地使用SQL会减慢它的速度。有没有人有任何见解?如果需要,我可以提供更多信息。

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

3 个答案:

答案 0 :(得分:2)

我已经阅读了这个问题,当我读到这个时我停了下来:

  

从源头看,它内部只有一堆单行选择   嵌套循环后的嵌套循环。它不仅有大量的SELECT   *

在不知道更多关于这个问题的情况下,这看起来过于苛刻,因为在每个循环中,程序都会执行对数据库的调用。也许这是以这种方式完成的,因为所选数据的数据集太大,但是可以加载数据块,然后处理它们然后重复操作,或者您可以进行大的JOIN并对该数据进行操作。这有点棘手但请相信我能做到这一点。

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

另一方面,使用JOIN不一定会提高性能,它取决于表中索引和外键的知识和使用。例如,如果您连接表来获取描述,我认为最好在内部表中加载该数据,并通过BINARY SEARCH从中获取描述。

我无法准确说出公式是什么,具体取决于具体情况,大多数时候你必须调整代码,调试和测试并利用交易' ST05'和' SE30'检查性能并重复该过程。在SAP中使用这些问题的经验可以让您清楚地看到这些模式。

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

希望有所帮助

答案 1 :(得分:1)

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

SQL Server存储过程可以接受'table'类型的参数,它们在客户端/ C#端的数据库连接上是对应于表结构的一些数据结构的简单列表。

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

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

答案 2 :(得分:1)

你是对的。

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

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

对于常见情况,SAP通常会有很容易定义的视图。

修改

您可以查看演出的位置:http://scn.sap.com/community/abap/testing-and-troubleshooting/blog/2007/11/13/the-abap-runtime-trace-se30--quick-and-easy

使用不当的书面部分非常重要。

根据统计数据,您可以了解优化工作付出的位置。