点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
大家好,我需要使用cron作业从数据库中删除所有过期的价格行。
我当前正在做的是获取此类PriceRowModels的列表,并将其传递给modelService.removeAll()函数。 型号数量为1,300,000+。 这项工作进行了2个多小时,不得不中止,而计数的变化仅为4。
即 之前:1,300,004
之后:1,300,000
现在,当作业运行时,我一直在查询,并且计数完全没有变化。 我也尝试过将总数减少到83,000+,但仍然是同一问题。
知道为什么会这样吗?
此外,最好只是迭代模型列表并一次对一个模型使用remove()函数?
谢谢。
这很不方便,因为它将要求所有这些模型都在内存中表示, 相反,尝试使用一些合理的获取窗口来实现MaintenanceCleanupStrategy
ModelService.removeAll()实际上只是为列表中的每个模型调用ModelService.remove()(或上次我检查过),这意味着它会为每个项目触发一个单独的SQL查询。 如果您的应用程序服务器与数据库之间的等待时间甚至是1毫秒,那么每个要删除的项目就是1毫秒EXTRA,甚至不算处理单独查询的额外开销。
我能够做到这一点的最快方法是创建一个批处理模式ImpEx脚本,该脚本将以更快的方式擦除表。 然后,您可以从代码中触发此ImpEx(使用旧版模式),并且应该合理地快速删除这些项目。
谢谢James
您好,我们有一个类似的案例,涉及超过250万个"模型"。 就我们检查modelService.removeAll()的来源而言,似乎ModelService使用事务,然后使用某种队列在分配的列表上一个接一个地迭代(如果我确实抓到了一些东西,请随时纠正我) 在这里错了)。 长话短说,我们决定使用ImportService来使用" impex解决方案",并使用" remove impex header"来删除模型。 希望它能有所帮助。
当在转换过程中必须导入1000万个订单/订单条目时,我们还采用了创建批处理方式的impex,请确保在旧版模式下运行impex批处理方式。 您还可以将线程数设置为4或6或8
报告的行为是由于事务引起的:如果使用
removeAll()
除去数据,则所有数据将在一次事务中除去,并且您 在运行的事务之外看不到更改。 如果发生大事务,这会对数据库造成很大的压力(我强烈建议不要影响事务中的1万行以上)。 您应该做的是获取一批要删除的模型,将其传递给removeAll()
,提交事务,然后重新开始。 要使用的批量大小在100-1000之间。请注意,HAC中的Groovy脚本在显式事务中执行,因此
remove()
和removeAll()
之间实际上没有区别。 如果您熟悉Hybris中的事务API,则提交当前事务应该没有问题。impex方法可能有效,因为每一行都是在单独的事务中处理的。 请注意,通过impex批量删除可能会遇到与脚本相同的问题。
一周热门 更多>