Performance 数据导出性能问题-循环还是联接?

Performance 数据导出性能问题-循环还是联接?,performance,abap,opensql,Performance,Abap,Opensql,我负责一个上传ABAP生成的平面文件的系统。我们每天从SAP中的人力资源模块生成500000条记录,为每个人生成下一年的记录。如果一个人在某一天被列入名册,或计划在某一天休假,他将获得一份记录 此作业需要8个多小时才能运行,并且开始变得时间紧迫。我不是ABAP程序员,但在与程序员讨论这个问题时,我很担心,因为他们一直在提到“循环” 从源代码看,它只是嵌套循环中一个接一个的一组单行选择。不仅如此,它还有大量的选择 我建议程序员更多地使用SQL,但他们坚持认为SAP认可的方法是使用循环而不是SQL,

我负责一个上传ABAP生成的平面文件的系统。我们每天从SAP中的人力资源模块生成500000条记录,为每个人生成下一年的记录。如果一个人在某一天被列入名册,或计划在某一天休假,他将获得一份记录

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

从源代码看,它只是嵌套循环中一个接一个的一组单行选择。不仅如此,它还有大量的选择

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

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

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


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

听起来,目前的导入是在单个记录上循环,然后一次导入一个数据库。很可能那里有很多冗余。这是一种我见过很多次的模式,我们采用的一般解决方案是批量导入数据

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

然后,存储过程可以在一次调用中接收和处理csv文件的多行,因此,您需要执行的任何连接都是在输入数据集上完成的,这就是关系数据库的使用方式。如果您要连接到常用数据,或者有很多外键,这些外键本质上是调用连接以验证您尝试插入的键,那么这一点尤其有用


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

听起来像是在单个记录上循环,然后一次将它们导入一个DB。很可能那里有很多冗余。这是一种我见过很多次的模式,我们采用的一般解决方案是批量导入数据

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

然后,存储过程可以在一次调用中接收和处理csv文件的多行,因此,您需要执行的任何连接都是在输入数据集上完成的,这就是关系数据库的使用方式。如果您要连接到常用数据,或者有很多外键,这些外键本质上是调用连接以验证您尝试插入的键,那么这一点尤其有用

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

您是正确的

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

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

对于常见情况,SAP中通常有现成的定义视图

编辑:

您可以检查您的性能的去向:

写得不好的部分很少使用并不重要

有了这些统计数据,你就知道优化工作的代价是什么了。

你是对的

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

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

对于常见情况,SAP中通常有现成的定义视图

编辑:

您可以检查您的性能的去向:

写得不好的部分很少使用并不重要


有了这些统计数据,你就知道这会给你的优化工作带来什么样的损失。

我已经阅读了这个问题,我决定 当我读到这篇文章时:

从源代码上看,里面只有一堆单行选择 嵌套循环之后的嵌套循环。不仅如此,它还有大量的选择 *

在不了解更多问题的情况下,这看起来有些过分,因为在每个循环中,程序都会执行对数据库的调用。也许这样做是因为所选数据的数据集太大,但是可以加载数据块,然后对它们进行处理,然后重复该操作,或者可以进行大连接并对该数据进行操作。这有点棘手,但请相信我,这能解决问题

在SAP中,发生这种情况时必须使用这种技术。没有什么比在内存中处理数据集更有效的了。为此,我建议使用排序表和/或哈希表以及二进制搜索

另一方面,使用联接并不一定会提高性能,它取决于表中索引和外键的知识和使用。例如,如果您连接一个表以获取描述,我认为最好将该数据加载到一个内部表中,并通过二进制搜索从中获取描述

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

我给你的最好建议是复制一份程序,并根据你的经验进行修改。您描述的代码肯定可以改进。你能松开什么


希望有帮助

我已经阅读了问题,当我读到以下内容时,我停了下来:

从源代码上看,里面只有一堆单行选择 嵌套循环之后的嵌套循环。不仅如此,它还有大量的选择 *

在不了解更多问题的情况下,这看起来有些过分,因为在每个循环中,程序都会执行对数据库的调用。也许这样做是因为所选数据的数据集太大,但是可以加载数据块,然后对它们进行处理,然后重复该操作,或者可以进行大连接并对该数据进行操作。这有点棘手,但请相信我,这能解决问题

在SAP中,发生这种情况时必须使用这种技术。没有什么比在内存中处理数据集更有效的了。为此,我建议使用排序表和/或哈希表以及二进制搜索

另一方面,使用联接并不一定会提高性能,它取决于表中索引和外键的知识和使用。例如,如果您连接一个表以获取描述,我认为最好将该数据加载到一个内部表中,并通过二进制搜索从中获取描述

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

我给你的最好建议是复制一份程序,并根据你的经验进行修改。您描述的代码肯定可以改进。你能松开什么


希望它能有所帮助

我倾向于将此标记为主要基于意见,但我同意8小时运行时间通常意味着让具有适当技能的人来看看这一点,因为您提到人力资源,共享一些代码可能会有所帮助。在给出任何真正的建议之前,需要仔细考虑的一个问题是,您提到的选择是在自定义代码中还是在SAP功能模块中?这实际上是一个ABAP和SAP问题。您需要让熟悉SAP为此功能领域提供的API的人员查看。这几乎肯定是做错了,导致了性能问题,但切换到SQL可能也是错误的,但并不总是错误的。看看SAP是否提供了批量查找API。谢谢大家的反馈。我意识到没有示例代码就不可能有明确的答案,但我更感兴趣的是循环与连接的反馈。在谷歌上做了更多的搜索之后,这显然是一个热门的讨论话题。我倾向于将其标记为主要基于观点,但我同意8小时的运行时间通常意味着让具有适当技能的人来看看这一点,因为你提到了人力资源,分享一些代码可能会有所帮助。在给出任何真正的建议之前,需要仔细考虑的一个问题是,您提到的选择是在自定义代码中还是在SAP功能模块中?这实际上是一个ABAP和SAP问题。您需要让熟悉SAP为此功能领域提供的API的人员查看。这几乎肯定是错误的,导致了性能问题,但切换到SQL也可能是错误的,但并非总是如此
不准确的看看SAP是否提供了批量查找API。谢谢大家的反馈。我意识到没有示例代码就不可能有明确的答案,但我更感兴趣的是循环与连接的反馈。在谷歌上做了更多的搜索之后,这显然是一个热门的讨论话题。是的-在较新的系统中使用SE30或transaction SAT还有一个非常方便的提示和技巧按钮,专门解决常见的性能问题。其中我相信select*和select in a loop是可以解决的。是的-在较新的系统中使用SE30或transaction SAT还有一个非常方便的提示和技巧按钮,专门解决常见的性能问题。其中,我相信select*和select IN a loop是可以解决的。