You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Apex迭代报表网页端查询耗时久问题排查求助

Oracle Apex迭代报表网页端耗时异常排查

问题概述

启用分页时,迭代报表查询执行耗时16秒;关闭分页、设空最大返回行数后,PL/SQL中执行Apex生成的查询仅需0.097秒,但网页端仍耗时16秒。

原查询语句:

SELECT '' Link,
       C.CHA_IN_CODIGO "Cod",
       C.CHA_ST_ASSUNTO "Assunto",
       C.CHA_DT_ABERTURA "Dt Abertura",
       C.CHA_ST_STATUS "Status",
       C.CHA_ST_TIPO "Tipo",
       U.USU_ST_NOME "Solicitante",
       CA.CAT_ST_DESCRICAO "Categoria",
       L.ORF_ST_DESCRICAO "Localização"
       

  FROM INF_CHAMADOS C

 INNER JOIN GLO_USUARIO U
    ON U.USU_IN_CODIGO = C.USU_IN_CODIGO

 INNER JOIN GLO_VW_LOCALIZACAO L
    ON L.ORF_IN_REDUZIDO = C.CHA_IN_LOCALIZACAO

 INNER JOIN INF_CHAMADOS_CATEGORIA CA
    ON CA.CAT_IN_CODIGO = C.CHA_IN_CODIGO

 WHERE (1 = 1
   AND C.CHA_ST_STATUS = 'Fechado'
   AND C.USU_IN_CODIGO = :COD_USUARIO) 
   OR (EXISTS (SELECT 1
          FROM INF_CHAMADOS_OBSERVADOR O
         WHERE O.CHA_IN_CODIGO = C.CHA_IN_CODIGO
           AND O.USU_IN_CODIGO = :COD_USUARIO
           AND C.CHA_ST_STATUS = 'Fechado')
)

Apex生成的执行代码(网页端耗时16秒):

select i.*
 from (select "LINK","Cod","Assunto","Dt Abertura","Status","Tipo","Solicitante","Categoria","Localização"
from(select /*+ qb_name(apex$inner) */d."LINK",d."Cod",d."Assunto",d."Dt Abertura",d."Status",d."Tipo",d."Solicitante",d."Categoria",d."Localização" from(SELECT '' Link,
       C.CHA_IN_CODIGO "Cod",
       C.CHA_ST_ASSUNTO "Assunto",
       C.CHA_DT_ABERTURA "Dt Abertura",
       C.CHA_ST_STATUS "Status",
       C.CHA_ST_TIPO "Tipo",
       U.USU_ST_NOME "Solicitante",
       CA.CAT_ST_DESCRICAO "Categoria",
       L.ORF_ST_DESCRICAO "Localização"
       --C.CHA_ST_DESCRICAO "Descrição" -- Causa lentidão

  FROM INF_CHAMADOS C

 INNER JOIN GLO_USUARIO U
    ON U.USU_IN_CODIGO = C.USU_IN_CODIGO

 INNER JOIN GLO_VW_LOCALIZACAO L
    ON L.ORF_IN_REDUZIDO = C.CHA_IN_LOCALIZACAO

 INNER JOIN INF_CHAMADOS_CATEGORIA CA
    ON CA.CAT_IN_CODIGO = C.CHA_IN_CODIGO

 WHERE (1 = 1
   AND C.CHA_ST_STATUS = 'Fechado'
   AND C.USU_IN_CODIGO = v('COD_USUARIO')) 
   OR (EXISTS (SELECT 1
          FROM INF_CHAMADOS_OBSERVADOR O
         WHERE O.CHA_IN_CODIGO = C.CHA_IN_CODIGO
           AND O.USU_IN_CODIGO = v('COD_USUARIO')
           AND C.CHA_ST_STATUS = 'Fechado')
)
)d
 )i 

)i where 1=1

可能的问题原因

  • 变量绑定方式差异:PL/SQL中直接使用绑定变量:COD_USUARIO,但Apex生成的代码用了v('COD_USUARIO')函数获取会话变量,这会导致Oracle无法重用执行计划,每次都要重新解析,甚至可能放弃索引扫描改用全表扫描。
  • 前端渲染开销:即使查询执行快,若返回的结果集行数极多,Apex前端需要将所有数据加载到页面并渲染成迭代报表,DOM节点创建、样式渲染等前端操作会消耗大量时间。
  • 视图执行计划差异:GLO_VW_LOCALIZACAO视图在PL/SQL会话和Apex会话下的执行计划可能不同——PL/SQL会话的优化器参数、权限配置可能让视图内部关联走高效索引,而Apex会话下的计划存在低效逻辑。
  • Apex额外流程开销:迭代报表会触发Apex内置的流程,比如数据类型转换、安全校验、会话状态同步等,这些步骤在纯PL/SQL执行中不存在,累积起来拉长了整体耗时。
  • 网络传输延迟:如果结果集数据量极大,从数据库服务器传输到Apex应用服务器,再到用户浏览器的网络耗时会占比很高;而PL/SQL执行是在数据库内部完成,没有这部分传输开销。

内容的提问来源于stack exchange,提问作者thund3rbird777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:05:05