Oracle pl / sql中的多线程概念

时间:2013-02-21 06:50:03

标签: .net multithreading oracle stored-procedures plsql

我创建了一个过程,它以一个Array的形式获取一些输入,该过程是从.NET Web应用程序传递的。

程序: 我打开一个包含表中所有数据的游标,然后逐行从游标中获取数据并对其应用验证规则。

对于每一行,我需要对DB进行多次点击(几乎包含嵌套查询);如果数据验证失败,那么我在同一个表中更新remarks字段(立即使用更新查询),如果验证成功,则在其他表中插入/更新数据。

我尝试了0.25百万条记录,我注意到处理它需要一个多小时。

我需要提高此存储过程的性能。请告诉我如何实现这一目标。

我对此有所了解。

制作多组记录(每组10 k),然后处理每一组,就像我们使用多线程一样。

这可能吗?如果是,那么如何?

2 个答案:

答案 0 :(得分:3)

在Oracle中注意到多线程。如果你真的需要在后台运行(并行),你需要JOB或SCHEDULER_JOB。您可以使用以下方法“理论上”加速顺序(批处理)处理:

  • bulk / forall constructs
  • UPDATE语句中的“当前状态”条件
  • 用MERGE语句替换INSERT / UPDATE
  • 在联接中使用“in memory”表 - SQL类型“TABLE OF< something>”
  • 在一些复杂的SQL查询中使用PARALLEL提示

请记住,“PL”和“SQL是两个不同的”虚拟“机器,它们之间的上下文切换(可能)很慢。

使用并行/多线程是Java / .NET世界中的常见解决方案。在Oracle中,这种方法不常用。

答案 1 :(得分:2)

很可能,通过使用PL / SQL批处理功能,您的程序可以更快。要并行运行代码,请查看DBMS_JOB和DBMS_SCHEDULER包。另外,检查代码的某些部分是否可以通过并行查询和/或并行DML加速。逐行是最慢的,特别是如果你使用显式游标。