优化应用程序性能
通过减小应用程序大小、简化数据模型以及策略性使用集合分析,可改善应用程序性能。本节将通过指出可能影响性能的方面以及如何评估和监视应用程序性能,帮助您避免性能问题。
您可以使用性能评估工具查看应用程序的性能。有关详细信息,请参阅应用程序性能评估。
应用程序复杂度
这些属于有助于诊断问题的宽泛类别。最复杂的应用程序性能最低。
简单应用程序:
- 不含复杂的集合分析或 If() 语句。
- 不含大型表格。
- 采用简单的数据模型。
- 包含简单的计算。
- 可能具有大量数据。
中等复杂应用程序:
- 拥有的数据模型包含许多表格,但遵照最佳实践。
- 使用集合分析以及数个 If() 语句。
- 工作表上有大型或宽型表格(15 列或更多)。
复杂应用程序:
-
拥有的数据模型非常复杂。
- 与大量数据连接。
- 包含复杂的计算、图表和表格。
大量数据
在您连接至大量数据时可以采用这些架构策略。
分割
您可按维度(例如时间范围、地区或聚合水平)分割 QVDs。例如,您可具有:
- QVD,含有最近两年的数据。
- QVD,含有两年以前的历史数据。
QVD,含有在更高级别上聚合的所有数据。例如,按月而不是日期,或者按国家而不是单个客户。
- 含有所有数据的一个大型 QVD,其仅由一小部分用户使用。
你可以用类似的方法来细分应用程序。较小的应用程序将满足大多数用户的分析需求。这样可节省内存。
您也可拥有专注于不同地区的多个应用程序。由此,用户将不会打开包含自己不感兴趣的数据或没有数据访问权限的应用程序。无法经由区域权限访问的数据也会影响内存。
On-Demand 应用程序生成 (ODAG)
Qlik Sense On-Demand 应用程序为用户提供大数据存储的聚合视图。它们可识别并加载相关的数据子集,以进行详细分析。
从用户的角度而言,有两个应用程序:
- 含有聚合数据的购物车。
- 用于显示详细信息的空模板应用程序。
用户在购物车应用程序中进行选择。一旦达到阈值,就会创建自定义 LOAD 脚本,该脚本用请求的详细信息填写模板应用程序。有关更多信息,请参阅通过 On-demand 应用程序管理大数据。
应用程序链接
应用程序链接(在 QlikView 中称为文档链接)意味着有一个聚合的应用程序,用户会定期使用它。如果用户需要更多详细信息,可将所做选择从聚合应用程序传递至详细信息应用程序,从而他们可以更低粒度级别进行查看。这样可节省内存,因为用户没有加载不必要的详细信息。可以通过向工作表中添加按钮对象来执行应用程序链接。 有关详细信息,请参阅应用程序链接。
还通过 APIs 支持应用程序链接。例如,您可以使用应用程序集成 API 创建自定义应用程序链接。有关详细信息,请参阅应用程序集成 API (仅提供英文版本)。
动态视图
动态视图可实现高数据量或快速变化的数据场景的最新可视化。使用动态视图时,请考虑以下事项:
更新动态视图时,将直接加载数据源。更新性能受基础数据源性能的影响。
动态视图模板应用程序可以帮助您创建动态图表。
有关使用动态视图的详细信息,请参阅使用动态视图管理数据。
Direct Query
虽然建议使用内存中应用程序,但 Direct Query 允许您将数据保留在原始源中。请考虑以下事项以优化 Direct Query 的使用:
Direct Query 的性能在很大程度上受到底层数据源性能的影响。
保持 Direct Query 数据模型尽可能简单,因为复杂的查询可能会导致性能问题。
有关 Direct Query 的更多信息,请参阅直接用 Direct Query 访问云数据库。
数据模型性能
以下是可影响数据模型性能的指标。每一个都是将改善应用程序可用性的最佳实践。
操作 | 说明 |
---|---|
删除合成钥 | 在两个或更多数据表共有两个或更多字段时,Qlik Sense 会创建合成钥。这可能意味着脚本或数据模型中存在错误。要诊断合成钥,请参阅合成钥。 |
从数据模型删除循环引用 | 当两个字段具有多个关联时,会发生循环引用。Qlik Sense 将尝试通过更改与其中一个表格之间的连接来解决这些问题。不过,应当解决所有循环引用警告,请参阅了解并解决循环引用。 |
适当的数据粒度 | 您应当只加载必要的数据。例如:用户组仅需要按周、月和年划分的数据。您可在聚合的数据中加载,或在加载脚本中聚合数据以节省内存。如果用户确实需要可视化粒度级别较低的数据,可使用 ODAG 或文档链接。 |
尽可能使用 QVDs | QVD 文件包含从 Qlik Sense 中导出的数据表。当从脚本中读取数据时,该文件格式可提升速度,同时又非常紧凑。从 QVD 文件读取数据通常比从其他数据源读取快 10 到 100 倍。有关更多信息,请参阅使用 QVD 文件。 |
在加载时优化 QVD 文件 | QVD 文件可以用两种模式读取:标准(快速)和优化(超快)。所选模式由脚本引擎自动确定。 对于优化的加载存在一些限制。可重命名字段,但任何这些操作将导致标准加载:
|
利用增量加载 | 如果应用程序连接至不断更新的数据库中的大量数据,则加载整个数据集可能会非常耗时。您应当改为使用增量加载,以在数据库中检索新的或已更改的记录。有关详细信息,请参阅加载新的和更新的记录与增量加载。 |
合并 Snowflake 模型 | 如果您有 Snowflake 数据模型,将能够通过使用 Join 前缀或其他映射联接它们中的一些来减少数据表的数目。这对于大型事实表尤其重要。一个好的经验法则是只有一个大型表。有关详细信息,请参阅联接或不联接。 |
将具有较少字段数的表格去规范化 | 如果您有两个包含字段很少的表格,将它们合并可能会提升性能。 有关详细信息,请参阅使用 Join 和 Keep 合并表格。 |
采用映射加载的去规范化查找(叶)表格 | 如果您只需要将字段从一个表格添加到另一个表格,则不应当使用 Join 前缀。您应当使用 ApplyMap 查找函数,请参阅不要联接 - 使用 ApplyMap。 |
将时间戳删除或与日期字段分离 | 当时间戳出现时,日期字段可能会填满空间,因为字符串表示更大,且不同值的数目更大。如果您的分析不需要精度,您可以使用 Timestamp(Floor(YourTimestamp,1/24)) 将时间戳舍入到最近的小时,或者使用 Date(Floor(YourTimestamp)) 完全删除时间组件。 如果您需要时间戳,可将其与日期本身分离。您可使用相同的 Floor() 函数,然后沿用以下行,通过提取时间来创建新的字段:Time(Frac(YourTimestamp))。 |
从数据模型删除不必要的字段 | 您应当仅在数据模型中加载必要的字段。避免使用 Load * 和 SELECT。确保您保留:
|
在处理大量数据时避免链接表格 | 您应当尽可能使用链接表格。但是,如果您处理大量数据,串联表格可能优于链接表格。 |
串联维度分解为新的字段 | 您应当将串联的维度分解成单独字段。这样会减少在您的字段中唯一值的发生次数。这与时间戳的优化方式相似。 |
尽可能使用 AutoNumber | 您可创建优化负载,方法是先从 QVD 文件将数据载入,然后使用 AutoNumber 语句将值转换为符号键。 有关详细信息,请参阅AutoNumber。 |
避免数据岛 | 数据岛可能会有用,但通常会影响性能。如果您为选择项值创建岛,则使用变量。 |
基于增量时间范围存储 QVD | 您应当分段存储 QVD,如每月。然后这些较小的月度 QVD 可支持可能不需要所有数据的许多不同应用程序。 |
工作表性能
这些是将会改善工作表和可视化性能的最佳实践。
操作 | 说明 |
---|---|
尽可能避免 If() 函数 | 如果在聚合函数中使用 If() 函数,则该函数将在记录级别上运行并被多次求值。 例如,如果您在聚合中有 1000 个记录,将计算 If() 条件 1000 次。如果您嵌套语句,这可能迅速级联。您应当改为使用集合分析。在聚合之前应用集合分析筛选器,可实现更快的响应。这些响应也可经由集合分析缓存,而 If() 无法实现。您还可考虑对数据模型使用其他函数和修改。 |
尽可能避免来自聚合表中不同表中的字段。 | 计算聚合时,计算将通过两个步骤进行:
单线程部分会对性能产生很大影响。一个示例是聚合中有多个字段,例如 Sum(Quantity*ListPrice)。如果 Quantity 在事实表中,并且 ListPrice 在主产品表中,引擎首先需要连接两个表以找到组合,然后才能开始将产品求和。联接为单线程部分,求和为多线程部分。如果两个字段都在同一个表中,则不需要联接,并且聚合的计算速度要快得多。 |
尽量少使用 Aggr() 和嵌套的 Aggr() 函数 | Aggr() 函数对性能影响很大。不当使用可造成结果不准确。例如,在维度与 Aggr() 函数中的维度不同的表格中。有关详细信息,请参阅何时不应当使用 AGGR? |
尽可能使用集合分析 | 您可使用集合分析来定义与当前选择项定义的一般集合不同的数据值集合。有关详细信息,请参阅集合分析。 |
尽可能避免字符串比较 | 字符串比较的效果不如集合分析。例如,您应当避免 Match()、MixMatch()、WildMatch() 和 Pick()。可改为在脚本中创建标记或使用集合分析。有关详细信息,请参阅条件函数和条件聚合的性能。 |
用于包含密集计算的对象上的计算条件 | 当不存在选择项时,您能可视化许多记录。最佳实践是向对象添加计算条件,从而它们仅在进行特定选择后呈现。这样可避免创建非常大的超立方体。例如:GetSelectedCount([Country])=1 OR GetPossibleCount([Country])=1。在该场景中,除非用户选择单一国家/地区,或进行只能有一个国家/地区的其他选择,否则可视化将不会呈现。 |
尽可能在脚本中预先计算度量值 | 应当在脚本中计算数据模型中最低粒度级别上的任何度量值。例如,如果在表格中的同一记录有 Sales 和 Cost,则您可通过计算 Sales - Cost AS Margin 衍生利润值。如果您了解不会根据选择变化或绑定到不同粒度级别的其他值,则还可提前聚合这些值。 |
列数不到 15 并且具有计算条件的表格 | 列数达到 15 的表格可被视为宽表格。如果您的表格由许多记录组成,则应当在表格对象上使用计算的条件,从而该表格对象仅在符合特定选择或条件之后呈现。如果您的表格非常宽,可考虑:
|
工作表没有过量的对象 | 当用户导航至工作表时计算对象。每次用户在该工作表上进行选择时,如果缓存中不存在对象的当前状态,则将重新计算相应的每个对象。如果您具有含许多图表的工作表,用户几乎不得不在每次选择时等待每个对象进行计算。这将给引擎造成明显的负担。最佳的实践是遵照 Dashboard/Analysis/Reporting (DAR) 概念,开发简洁而且尽量小的应用程序。有关详细信息,请参阅 DAR 方法。 |
在脚本中使用数字标记以供在集合分析中使用 | 具有标记的集合分析可能比使用字符串比较或乘法更有效。 |
主条目可实现受管理度量的拖放并保证将表达式缓存。例如,Sum(Sales) 和 SUM(Sales) 不同。表达式的拼写和大小写都会被缓存,需要逐字匹配才能重新使用。 |
数据负载性能
在 Qlik Cloud 中使用应用程序时,优化数据加载对于获得无缝和响应式体验非常重要。本节重点介绍影响性能的因素,并就如何防止性能问题提供指导。
Qlik Data Gateway - Direct Access
当您使用 Qlik Data Gateway - Direct Access 将数据重新加载到应用程序中时,以下因素会影响性能:
托管数据网关的计算机与数据库之间的连接速度和延迟。
托管数据网关的计算机和您的 Qlik Cloud 租户之间的连接速度和延迟。理想情况下,将数据网关托管在与 Qlik Cloud 租户相同的区域,以提高性能。
数据库存储
缓慢的存储连接可能会增加重新加载时间。对于本地或云中托管的数据库,请考虑以下事项:
内部:如果您的数据库位于本地,并与其他应用程序共享服务器,则其性能可能会受到这些其他应用程序的活动的影响。
云如果大小正确,云数据库通常比本地数据库具有更好的性能。为了获得最佳效果,请为您的云存储选择一个靠近 Qlik Cloud 租户的地区。