针对开发人员的15个最佳Oracle APEX性能调优技巧

热哈布拉您好!

今天,我们公司已有28年的历史了,为了纪念这一愉快的活动,我们决定与您共享新材料。

感谢您对我们的常规作者尤里·波诺马列夫(Yuri Ponomarev)的翻译提供的帮助OBIEE支持本文

的作者是提供Reading Rewards服务的公司的创始人兼管理合伙人Michelle Scamin。早在2009年,米歇尔就因自己8岁和9岁的儿子读得太少而遭受痛苦。书籍根本无法与计算机和视频游戏竞争,因此米歇尔和她的丈夫决定开发一种系统,使孩子们可以通过阅读书籍来赚取时间来玩计算机游戏。 作为IT顾问和Web应用程序开发人员,Michelle开发了软件,该软件可使孩子们记录他们看电视的时间,而父母可以跟踪这一时间。这是“阅读奖励”服务的开始。 现在,实际上是一篇文章。







因此,您已经选择了一个出色的Oracle APEX应用程序来达到创纪录的速度-您无需编写太多内容。而且,正如俗话所说的,要怎么做-那是无法避免的!

2010年,我创建了一个应用程序,试图让我的两个小儿子读书。我承认,当时我没有考虑性能,它在战略上分散了一些多汁的“从巨大表中选择计数(*)”的策略。

嘿,我的男孩们并没有真正读过那么多东西,所以当时这些桌子很小。

让我们说,当我向公众发布该应用程序时,我很天真,而且我没想到它会加载每天有成千上万的用户,每天产生150,000次页面浏览。


Google Analytics(分析)的统计数据

除了所有这些使我感到非常兴奋的事实之外,我还没有为这么多的点击做好准备。我遇到了性能问题。您只需要承认我是Oracle APEX性能调优的狂热学生,并认为我将分享我多年来学到的一些知识。

如何识别瓶颈?


在评估应用程序的性能时,您需要注意很多事情。您将要考虑与其相关的问题,浏览器。网络问题。ORDS配置。数据库配置,包括可能丢失的索引。游戏中是否有数据库锁?期望?

一旦您感觉到基础基础设施状况良好且没有故障,可能就该考虑一下前端(Javascript和CSS)和后端(SQL和PL / SQL),将注意力转移到应用程序本身上。

1.前端:文件顺序很重要


首先,如果您包含自定义CSS和JS组件,请确保CSS 位于页面顶部,而JavaScript 位于底部

这样可以确保即使您尚未加载某些业务逻辑文件,用户也至少会获得用户界面组件。

2.查看活动监视器


这始终是一个入门的好地方。如果一切看起来很慢,而且您不知道在哪里看,则APEX开发环境中的活动监视器可以提供有价值的信息。


从APEX开发控制台链接到活动监视器,将

记录工作区和应用程序中的每个综合浏览量,包括有关用户,日期/时间戳,应用程序,page_id以及最重要的是应用程序运行时间的信息。

我最喜欢的综合浏览量报告是“按加权网页效果”。




从APEX活动监视器查看示例

请密切注意具有大量页面事件(意味着经常访问)的页面,以及平均应用程序运行时的高价值。我似乎记得乔尔·卡尔曼(Joel Kalman)曾经说过,应审查0.5秒以上的所有内容。当然,这是一个粗略的概括,可能与您使用APEX的特定情况无关。

活动监视器使使用IR变得容易,但是如果您需要更多细节,并且想要在不同的工作区中运行报表,则可以在SQL Developer中使用以下查询来使其尽可能详细:

select workspace
      , application_name 
      , application_id, page_id
      , count(*) total_page_events
      , avg(elapsed_time) avg_elapsed_time
      , sum(elapsed_time) elapsed_time
from apex_workspace_activity_log
where view_date between to_date('201911190900','RRRRMMDDHH24MISS') and to_date('201911191200','RRRRMMDDHH24MISS')
group by workspace, application_name, application_id, page_id
order by 6, 7 asc 

3.#TIMING#查找变量


因此,您可能发现页面运行缓慢。现在呢?

好吧,如果要检索并显示其经过时间,可以在报表区域的页脚中使用#TIMING#查找变量。这可以帮助您确定页面上最慢的区域,您可以将注意力转移到该区域。这在您可以进行大量工作的仪表板页面上特别有用。


在报表的页脚中使用替换行#TIMING#

然后运行报表将给出结果:



我喜欢此功能的一件事不一定是它确定哪些区域需要花费很多时间(我可以从我的网站上获取该信息)调试窗口,请参见下文),但它可以为最终用户提供信息。

我经常发现他们会要求我知道的数据会随着年龄的增长而可视化。至少,这使他们对可能发生的事情以及为什么他们必须等待比预期更长的时间有一些了解。

4.以调试模式运行页面


更好的是,在Debug LEVEL9中运行它以访问报表的执行计划。


调试窗口将显示页面上发生的所有事情,并显示每个组件的运行时。LEVEL9将生成大量的行,但是您可以按时间降序对其进行排序,以显示页面花费的时间最多。

5.当心调用v(“)


如果发现性能不佳的报告,则可以在可以使用bind变量时检查是否使用了v(“)表示法。

select task_name
from tasks
where assigned_to=:APP_USER

要么

select task_name
from tasks
where assigned_to=v('APP_USER')

在大表中,两个语句之间的差异可能很大,因为v(”)实际上是一个函数调用。这意味着您将不会利用任何索引,查询将导致全表扫描。

提示:如果需要在视图中引用APEX会话的状态(不能使用绑定变量),请考虑使用标量子查询,该子查询的计算效果几乎与绑定变量一样。看到:

select task_name
from tasks
where assigned_to = (select v('APP_USER') from dual)

感谢John Scott在我参加的活动之一中提供了此功能。

6.尽可能避免在查询中使用字符串替换


当心查询中的查询字符串。

例如,考虑一种情况,在这种情况下,您可能需要在查询中使用解码或case语句来确定要跳转到的页面:

select case when dept_no=20 then
          'f?p=&APP_ID.:3:&SESSION.::::P3_DEPTNO:'||deptno
       else
          'f?p=&APP_ID.:2:&SESSION.::::P2_DEPTNO:'||deptno
       end as link
       , deptno
       , dname
from dept

使用绑定变量:SESSION,而不是&SESSION查找字符串。可以带来巨大的变化,并节省大量的Oracle分析时间。绑定变量版本允许Oracle重用查询。

select case when dept_no=20 then
          'f?p=&APP_ID.:3:'|| :SESSION ||'::::P3_DEPTNO:'||deptno
       else
          'f?p=&APP_ID.:2:'|| :SESSION ||'::::P2_DEPTNO:'||deptno
       end as link
       , deptno
       , dname
from dept

如果您想了解更多有关此内容的信息,请查看Jorge Rimblas精彩视频,其中包含通配符字符串,绑定变量和APEX链接。

7.尽可能在您的条件中使用声明性参数


在页面组件上使用条件时,请始终尽可能使用声明性参数。他们将更加有效。


8.合理使用分页设置


在大型报告中,所选的分页选项可能会产生重大影响。尽管自从18.1版APEX以来,分页处理有了显着改善(请参阅Karsten Charsky撰写的精彩文章),但是如果您遇到性能问题,可以在其中一个参数中禁用参数“从X到Y到Z的行范围”在一个非常大的报告中。


9.避免在查询中使用HTML并使用HTML表达式


如果可能,请为报告列使用HTML表达式属性,以包括您可能需要的所有HTML / CSS属性。

10.


因此,您已经确定了一个非常慢的报告区域,并已将其配置为最佳。

每次查看页面时都需要更新数据吗?想想仪表盘报告,特别是销售数据等。即使在1分钟前收到的交易数据在许多情况下也可以很完整。

如果是这样,您可以使用区域缓存选项。



APEX区域中的服务器缓存设置。

默认情况下,缓存是禁用的,但是如果启用它,则可以选择“缓存超时”选项,从10秒开始。甚至10秒也将有助于仪表板的性能,该仪表板被大量用户使用!很明显,增加此参数会有所帮助。

警告,如果您有依赖用户的敏感数据,则可以选择“按用户缓存”甚至“按会话缓存”选项。


启用区域缓存时的可用设置

如果您决定启用缓存,则可以通知用户有关最新数据更新的信息。如果是这样,您可以使用APEX_UTIL.CACHE_GET_DATE_OF_REGION_CACHE函数

11.将PL / SQL移至程序包


确保将代码移至程序包。它们已经在数据库中进行了编译,这意味着动态分析的开销将减少。

只要有可能,您的页面处理过程都应该只是程序包调用。

Stephen Feuerstein撰写了一篇非常详细的文章,为您编写Oracle Application Express的PL / SQL她已经几岁了,但仍然很重要!

12.启动顾问!


我很少看到有人使用此强大功能,但这是我们所有人都应该定期做的事情。每次我想知道他还能找到什么。


13.使用构建选项禁用和启用组件


好吧,您尝试了所有这些事情,但仍然无法确定是什么。如果要“再次重新绘制页面”,则应考虑对页面的各个组件使用构建选项。

请勿在组件上放置不确定的条件,否则您将失去所有宝贵的条件!此外,永久性组件还具有永久存在于您的应用程序中的不愉快功能。使用状态:排除

创建新的构建参数

将其交替应用到页面的各个组件。每次更改时都从页面开始,看看效果是否更好。如果您的页面突然运行得更快,则可能是您找到了罪魁祸首。

14.了解各种IR设置如何影响APEX性能。


对于执行不佳的交互式报告,用户应用的各种设置,参数或过滤器会加剧不良工作(是的,的确如此)。

如前所述,最好先使用LEVEL9调试模式并配置一个单独的实际查询。检查执行计划,检查索引,并尽可能进行调整。请记住,每个视图(表格,分组,图表,摘要)都是一个单独的查询,可能需要自定义。然后,当使用搜索过滤器或列标题过滤器时,它将再次更改!

您的MaxRowCount设置也会起作用,您应该尝试使其尽可能小。对此没有正确的答案,在获得对用户有用的东西之前,您可能必须使用不同的数字。

基本上,请考虑删除或更改一些默认行为方案。对于为用户启用哪些功能,开发人员具有许多控件。值得尝试各种设置,并且不要忘记与用户协商以确保您完全了解他们的要求。

最后,如果您发现IR 仍然太慢,可以考虑2种选择:

  1. 传送带表功能(从表中选择*(my_rpt_pipelined))->它们在复杂的查询中可以更好地工作。
  2. 生成收款报告(APEX_COLLECTION)

感谢Karen Cannell提供了这些超级有用的IR提示。

15.追踪


如果所有其他方法均失败,则可以在URL的末尾添加“&p_trace = YES”以创建一个跟踪文件,可以使用TKPROF实用程序对其进行分析。

有关SQL跟踪的更多信息,请参见此处

还是卡住了吗?我总是对Oracle APEX社区的响应能力感到惊讶在各种论坛或Twitter上伸出援助之手,寻求帮助,肯定有人会为您指明正确的方向。我收到了无数关于求助电话的回复。您会找到答案!请记住:这不是APEX,通常是您自己,您自己 :-)

All Articles