并行执行 oracle SQL 语句的最佳方法

Posted

技术标签:

【中文标题】并行执行 oracle SQL 语句的最佳方法【英文标题】:Best way to execute oracle SQL statements in parallel 【发布时间】:2014-08-29 09:48:05 【问题描述】:

我之前也问过类似的问题,但现在我希望能提供一些细节。我有 5-11 个 SQL 需要在 C# .NET 4.5 Web 应用程序中运行,目前它们是按顺序完成的,这会导致响应时间变慢。

与各种架构师/DBA 交谈时,他们都告诉我这可以通过并行运行查询来改进,但从不提供具体细节,当我问他们时,他们变得非常模糊;0)

Oracle 中是否有一些可用的函数可以调用以传递查询以并行运行?

或者我一直在研究 ASYNC/AWAIT 功能,但是网络上的示例令人困惑(大多数涉及将控制权返回给 UI,然后在任务最终完成时更新屏幕上的一些文本),我想知道如何调用多个方法让他们并行执行 SQL,然后等待所有方法都完成后再继续。

如果有人能指出好的文档方向或提供具体示例,我将不胜感激!!!!

更新了示例代码,有人可以指出如何将其更新为异步以等待所有各种调用完成:

    private CDTInspection GetDetailsInner(CDTInspection tInspection)
    
        //Call Method one to get data
        tInspection = Method1(tInspection);

        //Call Method two to get data
        Method2(tInspection);

        //Call Method three to get data
        Method3(tInspection);

        //Call Method four to get data
        Method4(tInspection);

        return tInspection;

    



    private void method2(CDTInspection tInspection)
    
        //Create the parameter list
        //Execute the query
        //MarshalResults
    

【问题讨论】:

最简单的方法是在您的应用程序代码中拥有多个线程(每个都有一个 Oracle 连接)。 看我以前的answer,另一个answer 取决于您的架构师的意思。如果他们建议您将 5-11 个查询合并为一个并行查询,则可以而且应该在数据库中完成。如果他们建议您并行运行 5-11 个单独的查询,则应使用编程语言来完成。 Async/await 是关于 异步 编程 - 这与 并行执行 .... 没有任何关系 实际上我认为这就是问题所在,我一定对用于解决此问题的异步处理感到困惑,有一些示例表明多个长时间运行的 sql 是使用它的原因,但没有实际的例子。我将研究线程。 【参考方案1】:

您可以使用 DBMS_SCHEDULER 创建作业以独立运行。从有关DBMS_SCHEDULER 的文档中阅读更多信息。

例如,您可以并行运行作业:

BEGIN
    DBMS_SCHEDULER.RUN_JOB('pkg1.proc1', false);
    DBMS_SCHEDULER.RUN_JOB('pkg2.proc2', false);
    DBMS_SCHEDULER.RUN_JOB('pkg3.proc3', false);
END;
/

【讨论】:

这里有一些代码会很好,只提供其他资源的链接是个坏主意。 不鼓励在 SO 上仅链接答案。如果您的答案中没有包含这些链接中的关键点,那么该答案很可能会进入审核队列以供删除。 好吧,没关系。我会按照建议去做。我是 SO 新手,不知道指向 Oracle 文档的链接还不够。将准备有用的点来发布。我是其他 Oracle 论坛的版主,但这条规则/期望对我来说是新的。【参考方案2】:

如果您想在应用程序中并行运行 5-11 查询,则必须启动多个线程并在线程中并行执行查询。

但是,如果您希望数据库在数据库服务器上并行执行查询,如果查询长时间运行并且您希望加快单个查询的执行时间,通常很有用,那么您可以使用 @987654321 @。

并行执行有利于具有以下所有特征的系统:

对称多处理器 (SMP)、集群或大规模并行系统 足够的 I/O 带宽 未充分利用或间歇性使用的 CPU(例如,CPU 使用率通常低于 30% 的系统) 足够的内存来支持额外的内存密集型进程,例如排序、散列和 I/O 缓冲区

实现并行执行的最简单方法是通过提示:

SELECT /*+ PARALLEL */ col1, col2, col3 FROM mytable;

但是,这可能不是最好的方法,因为它会更改您的查询并有其他缺点(例如,如果您想再次停用并行性,您将不得不再次更改查询)。另一种方法是在表级别指定:

ALTER TABLE mytable PARALLEL;

这将允许在不需要更改查询本身的情况下再次停用并行执行。

【讨论】:

以上是关于并行执行 oracle SQL 语句的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

oracle 并行执行sql

oracle 怎样使用并行查询

在SQL语句中用PARALLEL指定并行查询,应该怎么用

使用 Sqoop 并行导入 Oracle 表的最佳方法是啥?

Oracle“并行执行”之二——并行执行类型

Oracle PL/SQL 并行执行 [重复]