1

我创建了一个过程,它以数组的形式接受一些输入,这些输入是从 .NET Web 应用程序传递的。

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

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

我对 25 万条记录进行了尝试,发现处理它需要一个多小时。

我需要提高这个存储过程的性能。请让我知道如何实现这一目标。

我对此有一个想法。

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

这可能吗?如果是,那怎么办?

4

2 回答 2

3

在 Oracle 中有类似多线程的注意事项。如果你真的需要在后台(并行)运行某些东西,你需要 JOB 或 SCHEDULER_JOB。您可以“理论上”通过使用以下方法加速您的顺序(批处理)处理:

  • 整体/整体结构
  • UPDATE 语句中的“WHERE OF CURRENT”条件
  • 用 MERGE 语句替换 INSERT/UPDATE
  • 在连接中使用“内存中”表 - SQL 类型“TABLE OF <something>”
  • 使用 PARALLEL 提示 - 在一些复杂的 SQL 查询中

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

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

于 2013-02-21T11:46:12.027 回答
2

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

于 2013-02-21T07:27:14.550 回答