Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.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
Oracle PL/SQL过程的运行速度比SQL慢_Sql_Oracle_Plsql - Fatal编程技术网

Oracle PL/SQL过程的运行速度比SQL慢

Oracle PL/SQL过程的运行速度比SQL慢,sql,oracle,plsql,Sql,Oracle,Plsql,似乎我已经找到了我自己问题的答案: 首先,让我重述我的问题: “在完全相同的环境和条件下”——一些用户抱怨,当相同的SQL成为PL/SQL过程或包的一部分时,在几秒钟内运行的相同SQL需要一个多小时 这里的关键词是“相同的条件和环境”。Oracle版本为12.1.0.2.0。表、行计数、操作、统计信息等对于这两种(SQL和PL/SQL)都是相同的 这里有一个快速测试 我选择的语句是直接更新-因此实际上没有网络或终端显示延迟 创建一个包含200000行的表。(没有任何索引等) 在服务器级别启用SQ

似乎我已经找到了我自己问题的答案:

首先,让我重述我的问题:

“在完全相同的环境和条件下”——一些用户抱怨,当相同的SQL成为PL/SQL过程或包的一部分时,在几秒钟内运行的相同SQL需要一个多小时

这里的关键词是“相同的条件和环境”。Oracle版本为12.1.0.2.0。表、行计数、操作、统计信息等对于这两种(SQL和PL/SQL)都是相同的

这里有一个快速测试

我选择的语句是直接更新-因此实际上没有网络或终端显示延迟

  • 创建一个包含200000行的表。(没有任何索引等)
  • 在服务器级别启用SQL_TRACE=on
  • SQL: A.更新统计数据 B定时

    Update TABLE_1 set Character_Col = 'XXXX';
    
    PL/SQL:

    a。更新统计数据

    create or replace procedure upd_tab as
    begin
       update TABLE_1 set Character_Col = 'XXXX';
    
       dbms_output ( .. print SQL%ROWCOUNT etc. );
    end;
    
    比较跟踪时,在跟踪的执行部分会发现显著差异

    SQL:

    PL/SQL:

    call     count       cpu    elapsed       disk      query    current        rows
    Execute      1      2.13       5.94          0       1884     256912      200000
    
    所以,我能理解的是,当PL/SQL向SQL发送语句时,会发生上下文切换。当语句作为SQL直接执行时,则不涉及上下文切换

    我的最终用户似乎在使用游标从存储过程一次向数据库发送一条UPDATE语句。对于100000多行来说,这几秒钟的时间很快就累积起来了

    这让我想起了汤姆·凯特的名言(不完全是;希望有人能找到链接)

    如果您想做某事,请使用SQL执行

    如果SQL不适合,则在PL/SQL中执行

    如果PL/SQL不适合,那么就用Java来实现

    如果Java不适合,则作为外部C过程执行

    如果外部C不合适,那么想想——为什么我们首先要这么做


    不同的提示、会话参数、Resuce限制、上下文、绑定变量、错误。。最好是比较执行计划。

    如果没有更多细节,很难说。我的猜测是,它实际上不是同一个SQL语句,其中一个使用绑定变量/文本/SQL概要文件/大纲/其他东西,而另一个则不是。您希望我们如何回答这样一个问题:这里没有有用的信息。你能在没有更多细节的情况下,对可能导致这种情况的数百万件事情发表一些疯狂的猜测吗?当然这里有一个和你问题中的细节一样清楚的答案:当然。您在PL/SQL过程中遇到了一个问题。找出并修复它。我们使用的是oracle 11.2.0.3标准版。我们不使用SQL配置文件或SQL基线。PL/SQL使用绑定变量,SQL语句(自然)使用硬编码文本。因此,SQL是否可能正在使用最新的解释计划,并且由于某种原因PL/SQL无法使用最新的解释计划。@JustinCave,Ken White。问题是“可能有什么问题?”。有效答案包括“参数转换”、“SQL和PL/SQL引擎之间的上下文切换”。不需要否决票。答案是。@AlainPanetier-就目前而言,这个问题过于宽泛,因为几乎有数千个可能的答案,而且没有足够的信息来确定哪一个答案最有可能。是的。我比较了执行计划。在PL/SQL中花费更多时间的唯一原因是上下文切换。请注意,CPU时间几乎是相同的,因为一旦上下文切换完成,CPU执行它所花费的精力是相同的。循环中的语句。如果只是一次执行和不同的运行时间,可能与上下文切换无关。是的-我的最终用户正在循环中运行更新-因此有100000多个上下文切换。即使是几毫秒的时间也会累积起来。谢谢你提供的信息。如果上下文切换是一个问题,那么可能可以考虑批量操作。干杯
    call     count       cpu    elapsed       disk      query    current        rows
    Execute      1      2.13       5.94          0       1884     256912      200000