【问题标题】:Multi threading Concept in Oracle pl/sqlOracle pl/sql 中的多线程概念
【发布时间】:2013-02-06 10:05:09
【问题描述】:

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

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

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

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

我需要改进这个存储过程的性能。请告诉我如何实现这一目标。

我对此有一个想法。

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

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

【问题讨论】:

    标签: .net multithreading oracle stored-procedures plsql


    【解决方案1】:

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

    • bulk/forall 构造
    • UPDATE 语句中的“WHERE OF CURRENT” 条件
    • 用 MERGE 语句替换 INSERT/UPDATE
    • 在连接中使用“内存中”表 - SQL type "TABLE OF "
    • 使用 PARALLEL 提示 - 在一些复杂的 SQL 查询中

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

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

    【讨论】:

    • 上下文切换本身is not slow;做几千次就可以了。
    【解决方案2】:

    很可能,您的过程可以通过使用 PL/SQL 批处理功能来加快速度。要并行运行代码,请查看 DBMS_JOB 和 DBMS_SCHEDULER 包。此外,检查您的部分代码是否可以通过并行查询和/或并行 DML 加速。
    逐行是最慢的事情,尤其是在您使用显式光标的情况下。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多