Oracle Apex 正在生成一个需要很长时间才能执行的简单查询

问题描述 投票:0回答:1

我有一个迭代报告,并且启用了分页,这导致查询需要 16 秒才能完成。我读了一些有关它的信息

文字

以及禁用分页和可返回行的最大数量。现在,Apex 中生成的查询在 PL/SQL 中非常快。问题是,在网络上仍然需要很长时间。我使用了调试器,仍然需要 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_CATEGORIA

 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')
)

在 plsql 中 0,097 秒

我尝试删除分页并将 null 放入最大可返回行数中。

在调试器中获取 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_CATEGORIA

 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
sql oracle performance plsql oracle-apex
1个回答
0
投票

您提到的那篇文章已经有 8 年历史了……它可以追溯到 Apex 5。从那时起,很多事情都发生了变化 - 在 Apex 18 中(5 年前;))。我建议浏览this博客并检查这是否对您有任何帮助。

总结从 APEX 18.2 开始,开发人员可以控制分页的执行方式:APEX 提供了两个“伪提示”:APEX$USE_ROWNUM_PAGINATION 和 APEX$USE_NO_PAGINATION。这些伪提示只能被 APEX 识别,并且必须放置在页面设计器中的优化器提示区域属性中。

© www.soinside.com 2019 - 2024. All rights reserved.