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
相关产品推荐
相关产品推荐

