我负责一个上传由ABAP生成的平面文件的系统。我们每天从SAP的HR模块生成一个大文件(500,000条记录),为每个人生成下一年的记录。如果一个人在某一天值勤或计划在某一天休假,他会得到一个记录。
这个作业需要超过8个小时来运行,它开始变得时间紧迫。我不是一个ABAP程序员,但当我与程序员讨论这个问题时,我很担心,因为他们一直提到"循环"。
看源代码,它只是一堆单行选择在嵌套循环内嵌套循环。它不仅有很多SELECT
我建议程序员更多地使用SQL,但他们坚持SAP认可的方式是使用循环而不是SQL,并使用提供的SAP函数(即查找工作时间表规则),并且使用SQL会更慢。
作为一个数据库程序员,我从不使用循环(游标),因为它们比SQL慢得多,游标通常是一个过程程序员在数据库上放松的信号。
我只是不能相信改变一个现有的程序,更多地使用SQL而不是循环会减慢它的速度。有人有什么见解吗?如果需要,我可以提供更多的信息。
看看谷歌,我猜两边的人都会说它更好。
我读了这个问题,当我读到这个时,我停下来了:
看源代码里面只有一堆单行选择一个接一个的嵌套循环。它不仅有很多SELECT* .
在不了解更多问题的情况下,这看起来有点过分,因为在每个循环中,程序都会执行对数据库的调用。也许这样做是因为所选数据的数据集太大,但是可以加载数据块,然后处理它们,然后重复操作,或者可以创建一个大JOIN并对该数据进行操作。这有点棘手,但相信我,这是有效的。
在SAP中,当这种情况发生时,您必须使用这种技术。没有什么比在内存中处理数据集更有效的了。对此,我可以推荐使用排序和/或哈希表和二进制搜索。另一方面,使用JOIN不一定会提高性能,它取决于表中索引和外键的知识和使用。例如,如果你连接一个表来获取描述,我认为最好将该数据加载到一个内部表中,然后使用BINARY SEARCH从表中获取描述。
我不能确切地说出公式是什么,这取决于情况,大多数时候你必须调整代码,调试和测试,并利用事务'ST05'和'SE30'来检查性能并重复该过程。在SAP中处理这些问题的经验使您对这些模式有了清晰的认识。
我给你最好的建议是把那个程序复制一份,然后根据你的经验进行修改。你描述的代码肯定可以改进。你能失去什么?希望它能有所帮助
听起来像导入,因为它站在单个记录上循环,并一次将它们导入到DB中。很有可能有很多冗余。这种模式我见过很多次,我们采用的一般解决方案是批量导入数据…
SQL Server存储过程可以接受'table'类型的参数,这些参数在数据库连接的客户端/c#端是一些与表结构对应的数据结构的简单列表。
存储过程可以在一次调用中接收和处理csv文件的多行,因此您需要做的任何连接都是在输入数据集上完成的,这就是关系数据库的设计使用方式。如果您要连接到常用数据或有很多外键(实际上是调用连接来验证您试图插入的键),这一点尤其有用。
我们发现,使用这种方法可以大大减少给定数量的导入数据的SQL Server CPU和IO负载。但是,它确实需要与dba协商并对索引进行一些调优才能使其正常工作。
你是正确的。
在不知道代码的情况下,在大多数情况下使用视图或连接比使用嵌套循环要快得多。(也有例外,但非常罕见)。
您可以在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
写得不好的部分很少使用也没关系。
有了统计数据,你就知道哪里有问题,哪里值得你的优化努力。