Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行执行oracle SQL语句的最佳方法_C#_Sql_Multithreading_Oracle_Parallel Processing - Fatal编程技术网

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

C# 并行执行oracle SQL语句的最佳方法,c#,sql,multithreading,oracle,parallel-processing,C#,Sql,Multithreading,Oracle,Parallel Processing,我以前也问过类似的问题,但现在我想知道具体情况。我有5-11SQL需要在C#.NET4.5Web应用程序中运行,目前它们是按顺序运行的,这导致响应时间缓慢 与不同的架构师/DBA交谈时,他们都告诉我,这可以通过并行运行查询来改进,但当我问他们变得非常模糊时,他们从未给出如何改进的细节;0) Oracle中是否有一些函数可以调用以传递并行运行的查询 或者我一直在研究异步/等待功能,但是web上的示例令人困惑(大多数涉及将控件返回到UI,然后在任务最终完成时更新屏幕上的一些文本),我想知道如何调用几

我以前也问过类似的问题,但现在我想知道具体情况。我有5-11SQL需要在C#.NET4.5Web应用程序中运行,目前它们是按顺序运行的,这导致响应时间缓慢

与不同的架构师/DBA交谈时,他们都告诉我,这可以通过并行运行查询来改进,但当我问他们变得非常模糊时,他们从未给出如何改进的细节;0)

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

或者我一直在研究异步/等待功能,但是web上的示例令人困惑(大多数涉及将控件返回到UI,然后在任务最终完成时更新屏幕上的一些文本),我想知道如何调用几个方法,让它们并行执行SQL,然后等待它们全部完成,然后再继续

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

使用示例代码更新后,是否有人可以指出如何将其更新为async,以等待所有各种调用完成:

    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
    }

您可以使用独立运行的DBMS\U调度程序创建作业。请阅读有关的文档中的更多信息

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

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查询,则必须启动多个线程并在线程中并行执行查询

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

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

  • 对称多处理器(SMP)、群集或大规模并行系统
  • 足够的I/O带宽
  • 未充分利用或间歇使用的CPU(例如,CPU使用率通常低于30%的系统)
  • 足够的内存支持额外的内存密集型进程,如排序、哈希和I/O缓冲区
实现并行执行的最简单方法是通过提示:

SELECT /*+ PARALLEL */ col1, col2, col3 FROM mytable;
但是,这可能不是最好的方法,因为它会更改查询,并且还有其他缺点(例如,如果要再次停用并行性,则必须再次更改查询)。另一种方法是在表级别指定:

ALTER TABLE mytable PARALLEL;

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

最简单的方法是在应用程序代码中有多个线程(每个线程有一个Oracle连接)。请参阅我的上一篇文章,另一个线程取决于架构师的意思。如果他们建议您将5-11查询合并为一个并行查询,那么这可以而且应该在数据库中完成。如果他们建议您并行运行5-11个独立的查询,这应该用编程语言完成。Async/await是关于异步编程的-这与并行执行无关…实际上我认为这就是问题所在,我一定对用于解决此问题的异步处理感到困惑,有一些例子表明,多个长期运行的sql是使用它的原因,但没有实际的例子。我将转而研究线程。如果这里有一些代码就好了,只提供其他资源的链接是个坏主意。因此不鼓励只提供链接的答案。如果你的答案中没有包含这些链接中的关键点,那么这个答案很可能会被排在评论队列中删除。好吧,没关系。我会照建议去做。我是新来的,所以我不知道到Oracle文档的链接仅仅是不够的。将准备有用的要点发布。我是其他Oracle论坛的主持人,但这个规则/期望对我来说是新的。