【问题标题】:same Query is executing with different time intervals相同的查询以不同的时间间隔执行
【发布时间】:2014-03-04 12:21:03
【问题描述】:

我有一个场景,其中我有一个存储过程,其中包含一组 sql 语句(连接和子查询的组合,查询很大,无法显示) 最后结果存储在临时表中。

这是由具有特定权限的前端用户或后端程序员执行的。

这里的问题是,这个查询的执行时间存在差异。

有时需要 10 分钟,有时需要 1 小时,但平均经过的时间是 10 分钟,一个常见的事情是它总是提供相同数量的记录(大约相同)。

【问题讨论】:

    标签: sql oracle plsql oracle11g oracle-sqldeveloper


    【解决方案1】:

    正如 ErikL 所说,检查查询的执行计划是一个好的开始。在Oracle 11g 中,您可以使用DBMS_PROFILER。这将为您提供有关违规陈述的信息。我会多次运行它,看看多次运行时间之间有什么区别。首先检查您是否安装了DBMS_PROFILER。我相信它是一个单独的包。

    要启动分析器:

    SQL> execute dbms_profiler.start_profiler('your_procedure_name');

    运行您的存储过程:

    SQL> exec your_procedure_name

    停止探查器:

    SQL> execute dbms_profiler.stop_profiler;

    这将向您显示存储过程中的所有语句及其关联的运行时间,这样您就可以将问题缩小到可能导致差异的单个查询。

    这是DBMS_PROFILER 上的Oracle 文档: Oracle DBMS PROFILER

    【讨论】:

      【解决方案2】:

      如果您是 oracle 新手,那么您可以使用 dbms_output 或使用日志表来存储中间执行时间,这样您就可以知道是哪个 SQL 导致了问题。

      declare
      run_nbr number;
      begin
      run_nbr = 1; -- or get it from sequence
      SQL1;
      log(run_nbr ,user,'sql1',sysdate);
      SQL2;
      log(run_nbr ,user,'sql2',sysdate);
      commit;
      
      end;
      

      这里的日志过程只不过是简单的插入语句,它将插入到一个表中,比如“LOG”,它的列最少,比如 run_nbr、user、sql_name、execution_date

      procedure log(run_nbr number, user varchar2, sql_name varchar2, execution_date date)
      is
      begin
      insert into log values(run_nbr, user, sql_name, execution_date);
      -- commit; -- Un-comment if you are using pragma autonomous_transaction
      end;
      

      放置这些日志语句的时间很少,但可以让您了解执行时间。稍后,一旦您知道问题所在,您只需删除/注释这些行或在没有这些日志语句的情况下对原始过程进行代码备份,并在查明问题后重新编译。

      【讨论】:

        【解决方案3】:

        我会检查查询的执行计划,也许那里有一些并不总是使用的配置文件。

        【讨论】:

        • 您好 ErikL,谢谢您的建议,我是 oracle 新手,请您建议我可以检查执行计划和配置文件的内容
        【解决方案4】:

        或者如果这不能解决问题,您也可以尝试跟踪从前端调用 SP 的会话。这里有一个很好的关于追踪的解释:http://tinky2jed.wordpress.com/technical-stuff/oracle-stuff/what-is-the-correct-way-to-trace-a-session-in-oracle/

        【讨论】:

          猜你喜欢
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多