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

本文关键字:最佳 方式 语句 oracle SQL 并行执行 | 更新日期: 2023-09-27 18:20:01

我以前也问过类似的问题,但现在我很感激具体细节。我有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 SQL语句的最佳方式

您可以使用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;
/

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

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

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

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

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

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

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

ALTER TABLE mytable PARALLEL;

这将允许在不改变查询本身的情况下,如果不再需要并行执行,则可以再次简单地停用并行执行。