我创建了一个过程,它以一个Array的形式获取一些输入,该过程是从.NET Web应用程序传递的。
程序: 我打开一个包含表中所有数据的游标,然后逐行从游标中获取数据并对其应用验证规则。
对于每一行,我需要对DB进行多次点击(几乎包含嵌套查询);如果数据验证失败,那么我在同一个表中更新remarks
字段(立即使用更新查询),如果验证成功,则在其他表中插入/更新数据。
我尝试了0.25百万条记录,我注意到处理它需要一个多小时。
我需要提高此存储过程的性能。请告诉我如何实现这一目标。
我对此有所了解。
制作多组记录(每组10 k),然后处理每一组,就像我们使用多线程一样。
这可能吗?如果是,那么如何?
答案 0 :(得分:3)
在Oracle中注意到多线程。如果你真的需要在后台运行(并行),你需要JOB或SCHEDULER_JOB。您可以使用以下方法“理论上”加速顺序(批处理)处理:
请记住,“PL”和“SQL是两个不同的”虚拟“机器,它们之间的上下文切换(可能)很慢。
使用并行/多线程是Java / .NET世界中的常见解决方案。在Oracle中,这种方法不常用。
答案 1 :(得分:2)
很可能,通过使用PL / SQL批处理功能,您的程序可以更快。要并行运行代码,请查看DBMS_JOB和DBMS_SCHEDULER包。另外,检查代码的某些部分是否可以通过并行查询和/或并行DML加速。逐行是最慢的,特别是如果你使用显式游标。