Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
cristinadiao
Advisor
Advisor
SAP 分析云新优化故事模式为用户提供了全新的缓存机制。 这将提高故事整体的初始加载性能。此外我们还增加了新的设置,允许故事开发者调整微件的加载顺序,从而在不同场景下实现最佳性能。本文将基于 SAP 分析云 2023.16 版本深入介绍这些机制和性能相关的注意事项和建议 



优化故事查询定义以及模型元数据缓存 


当用户保存在新优化设计体验模式下创建的故事时,故事第一页的查询定义以及其所需的模型元数据将被公开缓存,供所有用户使用。这将提高故事初始加载性能,避免出现额外的往返请求。 

当故事相关的模型发生变化(包括计划模型版本变更)时,缓存将会失效。当用户首次查看故事时,系统将重新生成一个私有缓存,并与故事和用户账户关联。 

  • 当故事被重新保存时,所有的私有缓存将被移除。 


对于通过故事 page - onInitialization事件脚本修改查询的微件,缓存也将失效,例Chart.getDataSource().setDimensionFilter(dimension, members)。 

 

当用户使用书签时: 


书签将只会以 storyId 和 bookmarkId 为键生成公共缓存, 

如果用户将书签配置为“仅更改了状态的微件(默认选项)”或者“故事中的所有微件”,那么“保存书签”这一动作将会为所有用户生成公共缓存。 

  • 当故事被重新保存时,该缓存也将无效。当用户首次查看故事时,系统将重新生成一个公共缓存,并与故事和书签关联。 


如果用户将书签配置为“仅所选微件”,那么“保存书签”这一动作将不会生成缓存。 

 

  • 当用户首次查看故事时,系统将重新生成一个公共缓存,并与故事和书签关联。 


当用户使用书签Apply()脚本API加载书签时,将不会消耗或生成缓存。 

当用户重新保存故事时,所有与书签相关联的缓存都将被移除。 

 

性能相关设置 


名词解释 


可查看微件是指: 

  • 微件位于屏幕视口内。 

  • 微件本身及其父容器均可见 



  • 未打开弹出窗口中的微件不可见 


微件被创建是指: 

  • 微件实例被创建 

  • 微件实例可以通过脚本访问 



  • 微件正在等待渲染 


微件已加载是指: 

  • 微件被创建 

  • 微件已加载其查询数据 



  • 微件已经完成渲染 


 

微件数据刷新的决定顺序 

是否通过“正在加载优化设置”加载微件? 

当微件加载以后,是否暂停了数据刷新选项? 

 

正在加载优化设置 


一.无 


1.所有微件都会在故事初始化阶段加载 

2.所有微件加载完毕后,将触发 故事 page - onInitialization脚本。 



二.后台加载 





  1. 提示:部分微件不支持后台加载:如



  • 响应式通道 

  • 启用交叉微件功能的图表(如比例对齐、动态文本引用) 

  • 带有与模型维绑定的动态文本的文本微件 

  • 移动设备中故事级别的输入控件 

  • 带有不支持后台加载微件的微件容器 


 

       2.只有“可查看微件”和“不支持后台加载”的微件可以在故事初始化阶段加载。 

  • 注意:弹出窗口内的微件将被视为“不可查看微件”,因此其无法在故事初始化阶段被加载。 


      3.当“可查看微件”开始加载,故事 page - onInitialization 事件脚本将被触发。 

      4.当故事 page - onInitialization 事件脚本被执行时: 

  • “不可查看微件”将会逐个加载 

    • 表格不支持批量查询。因此后台加载多个表格的总加载时间可能比默认加载更长。

      • 推荐:如果您希望通过脚本访问表格,我们建议强制表格微件及其父类“始终在启动时初始化”。如果您担心其设置了“始终在启动时初始化”的父类会强制其他微件在故事 page - onInitialization事件之前加载,您可以将表格放置在一个特殊的面板容器中。当最终用户想要查看这些表格时,您可以使用Panel.moveWidget() 脚本 API 将这些表格移回至相应的容器。 









    • 图表、地理地图、输入控件以及带有动态文本的文本微件支持批量查询。因此他们的加载时间和默认加载相似。 



  • 注意:由于Javascript采用了单线程执行机制,这些微件将在故事 page - onInitialization事件脚本异步执行期间加载和渲染(举例而言:在脚本等待远程调用返回数据期间),因此故事 page - onInitialization事件脚本的总执行时间将会相应延长。 



  • 注意:在故事 page - onInitialization事件脚本执行阶段,如果脚本调用引用了一个仍未被加载的微件,该脚本调用将被保留,等待微件加载完成,随后再执行脚本调用。 



  • 推荐:在故事 page - onInitialization事件脚本尽可能少地引用“不可查看微件”,以加速执行过程。 


      5.故事 page - onInitialization 事件脚本被成功执行以后 

  • 终端用户可以查看故事内容并与微件交互 



  • 部分“后台加载”微件可能仍在加载中 



  • 注意:Chart and Table – onResultChange事件只有在完成首次数据查询后才会触发。 


      6.例外情况:强制微件“始终在启动时初始化”(视口加载或后台加载时除外) 

  • 当微件在其样式面板上启用了“始终在启动时初始化”时,它将被“视口加载”或“后台加载”的检查逻辑视为实际可见。 



  • 如果一个微件不可查看,那么在故事初始化阶段强制初始化该微件时,该微件的所有父微件都应当是可查看的或者启用了“始终在启动时初始化”。 



  • 无论是否启用了“始终在启用时初始化”,弹出窗口内的微件都将被视为不可查看微件。 


 

当微件位于画布上: 

























































微件于视口内  微件可见性  始终在启用时初始化  创建微件阶段 
  可见  未开启  初始化 
  可见  开启  初始化 
  不可见  未开启  后台 
  不可见  开启  初始化 
  可见  未开启  后台 
  可见  开启  初始化 
  不可见  未开启  后台 
  不可见  开启  初始化 

 

当微件位于容器微件内: 








































容器创建阶段为初始化  微件于隐藏选项卡条内或者页簿页面内  微件于视口中  微件可见性  始终在启用时初始化  创建微件阶段 
    与画布上的微件相同 
    不适用/不可用  任意  未开启  后台 
    不适用/不可用  任意  开启  初始化 
  任意  任意  任意  任意  后台  

 

三.视口加载 





  1. 支持视口加载的微件:图表、表格、地理地图、输入控件、带有动态文本的文本微件 



  • 其他微件的行为与“后台载入”选项相同 


      2.在故事初始化阶段,只加载可查看的微件。 

  • 注意:弹出窗口内的微件将被视为“不可查看微件”,因此其无法在故事初始化阶段被加载。 


      3.在可查看微件开始加载,故事 page - onInitialization 事件脚本被触发 

      4.当故事 page - onInitialization 事件脚本被执行时: 

  • 支持视口加载的不可查看微件(图表、表格、地理地图、输入控件、带有动态文本的文本微件): 

    • 这些被脚本引用的微件将逐个加载 

      • 表格不支持批量查询。因此后台加载多个表格的总加载时间可能比默认加载更长。 

      • 图表、地理地图、输入控件以及带有动态文本的文本微件支持批量查询。因此他们的加载时间和默认加载相似。 

      • 注意:通过 Application.getWidgets() 脚本 API 获取的微件无法识别为脚本引用的微件。 

      • 注意:在 2023.16 (QRC3) 中,使用 Application.getWidgets() API 按表格类型搜索微件会强制加载所有表格微件。该情况计划于 2023.QRC4 版本中进行修复。 






 



    • 不支持视口加载的不可查看微件 

      • 与“后台加载”选项一样,这些微件将会逐个加载 



    • 请注意下列情况 

      • 注意:由于Javascript采用了单线程执行机制,这些微件将在故事 page - onInitialization事件脚本异步执行期间加载和渲染(举例而言:在脚本等待远程调用返回数据期间),因此故事 page - onInitialization事件脚本的总执行时间将会相应延长。 

      • 注意:在故事 page - onInitialization事件脚本执行阶段,如果脚本调用引用了一个还未加载的微件,那么该脚本调用会暂时保留,待微件加载完成后再执行该脚本调用。 






 

  • 当故事 page - onInitialization 事件脚本被执行时: 





    • 终端用户可以查看故事内容并与微件交互 







    • 部分“后台加载”微件可能仍在加载中 







    • 当用户进行交互(如滚动页面或者更改可见性)时,一个支持视口加载件且不被脚本引用的不可查看微件变为可见,该微件将会被加载。 




 

  • 例外情况:强制微件“始终在启动时初始化”(视口加载或后台加载时除外) 





    • 当微件在其样式面板上启用了“始终在启动时初始化”时,它将被“视口加载”或“后台加载”的检查逻辑视为实际可见。 







    • 如果一个微件是不可查看的,在故事初始化时对其进行强制初始化,那么其所有的父微件应当是可查看的,或者已启用“始终在启用时初始化”功能。 







    • 无论是否启用了“始终在启用时初始化”,弹出窗口内的微件都将被视为不可查看微件。 







    • 保存书签将加载和渲染所有微件,然后恢复其最初的视口加载状态。 




 

 

 

当微件位于画布上 









































































脚本引用  微件于视口内  微件可见性  始终在启用时初始化  微件是否会被加载? 
    可见  未开启   
    可见  开启   
    不可见  未开启   
    不可见  开启   
    可见  未开启   
    可见  开启   
    不可见  未开启   
    不可见  开启   
  任意  任意  任意   

 

当微件位于容器内 






















































































  容器微件  微件自身   
脚本引用  是否可查看  始终在启用时初始化  微件于隐藏选项卡条内或者页簿页面内  微件于视口内  微件可见性  始终在启用时初始化  微件是否会被加载 
    任意    与画布上的微件相同 
    任意      任意  任意   
      任意  任意  任意  任意   
        任意  任意  未启用   
        任意  任意  启用   
        任意  任意  任意   
  任意  任意  任意  任意  任意  任意   

 

当微件于关闭的弹出窗口中 

































脚本引用  是否可查看  始终在启用时初始化  微件于隐藏选项卡条内或者页簿页面内  微件于视口内  微件可见性  始终在启用时初始化  微件是否会被加载 
  任意  任意  任意  任意  任意  任意   
  任意  任意  任意  任意  任意  任意   

当微件于开启的弹出窗口中 























脚本引用  是否可查看  始终在启用时初始化  微件于隐藏选项卡条内或者页簿页面内  微件于视口内  微件可见性  始终在启用时初始化  微件是否会被加载 
任意  任意  任意  任意  任意  任意  任意   

 

 

当弹出窗口开启且微件位于画布上 

































脚本引用  是否可查看  始终在启用时初始化  微件于隐藏选项卡条内或者页簿页面内  微件于视口内  微件可见性  始终在启用时初始化  微件是否会被加载 
  任意  任意  任意  任意  任意  任意   
  任意  任意  任意  任意  任意  任意   

 

总结 


如果您是不需要高级脚本功能的故事设计者,我们建议您使用默认的正在加载优化设置 =“视口加载”。 

如果您是需要高级脚本功能的故事设计者,我们建议您: 

  • 根据您的故事设计需求和场景,平衡初始加载时间和终端用户的首次交互响应时间。 



  • 通过设置微件及其父级 始终在启用时初始化=true,确认哪些微件应在页面开始时加载 - onInitialization 脚本访问。 

  • 在故事 page- onInitialization 事件的脚本中尽量少引用不可查看的微件。 


原文链接:SAP Analytics Cloud New Optimized Story Performance Deep Dive and Recommendations | SAP Blogs

原作者:jove.shi