跳到主要内容

优化应用程序性能

通过减小应用程序大小、简化数据模型以及策略性使用集合分析,可改善应用程序性能。本节将通过指出可能影响性能的方面以及如何评估和监视应用程序性能,帮助您避免性能问题。

应用程序复杂度

这些属于有助于诊断问题的宽泛类别。最复杂的应用程序性能最低。

简单应用程序:

  • 不含复杂的集合分析或 If() 语句。
  • 不含大型表格。
  • 采用简单的数据模型。
  • 包含简单的计算。
  • 可能具有大量数据。

中等复杂应用程序:

  • 拥有的数据模型包含许多表格,但遵照最佳实践。
  • 使用集合分析以及数个 If() 语句。
  • 工作表上有大型或宽型表格(15 列或更多)。

复杂应用程序:

  • 拥有的数据模型非常复杂。

  • 与大量数据连接。
  • 包含复杂的计算、图表和表格。

应用程序详细信息

您需要在应用程序大小方面考虑硬件环境,因为它会影响 Qlik Sense 部署性能。例如,如果您没有优化自己的应用程序,则它们可能需要更多的硬件资源。

监控应用程序大小将帮助您:

  • 了解当前性能。
  • 了解部署新应用程序的性能影响。
  • 了解修改现有应用程序的性能影响。
  • 解决性能问题。
  • 为将来成长进行计划。

Qlik 提供可帮助您评估应用程序的工具。有关更多信息,请参阅:Qlik Sense Enterprise (仅提供英文版本) 中的性能和可扩展性。

存在可能影响性能的基本应用程序元素:

能够影响性能的应用程序详细信息
特性 说明
应用程序磁盘大小 (MB) 您可在 QMC 中找到应用程序大小。转到应用程序,并打开右侧操作旁的列选择器。单击文件大小 (MB) 旁的单选按钮。如果您在使用 Qlik Sense Desktop,则可以在 Windows Explorer 中找到应用程序大小。默认文件夹为 %USERPROFILE%\Documents\Qlik\Sense\AppsApps 文件夹列出了所有应用程序名称和文件大小。

RAM 中的应用程序大小 (GB)

您可通过以下操作确定应用程序的基本 RAM 占用情况:

  1. 重启 Qlik Sense 服务器。
  2. 记下当前的 RAM 使用情况。
  3. 打开 Qlik Sense 应用程序。
  4. 记录 RAM 中的差异。

如果使用 Qlik Sense June 2018 或更新版本,您可使用 App Metadata Analyzer 找到该指标。有关更多信息,请参阅应用程序元数据分析器 (仅提供英文版本)

应用程序总行数 (M)

您可使用系统字段来计算总行数。使用度量 Sum($Rows) 创建 KPI 有关详细信息,请参阅系统字段
应用程序总字段数 您可使用系统字段来计算总字段数。使用度量值 Sum($Fields) 创建 KPI有关详细信息,请参阅系统字段
应用程序总表格数 您可使用系统字段来计算总表格数。使用度量值 Count(DISTINCT $Table) 创建 KPI有关详细信息,请参阅系统字段

监视您的应用程序

Qlik Management Console (QMC) 提供用于监控系统性能以及有关 Qlik Sense Enterprise on Windows 使用情况的应用程序:

  • Operations Monitor 应用程序提供了有关硬件利用率的信息,例如服务器内存和 CPU 使用情况、活动用户以及重新加载任务活动。此外,它还提供了有关 Qlik Sense 服务器环境中的错误、警告和日志活动的摘要和详细信息。

  • License Monitor 应用程序跟踪许可证使用情况,并帮助监控对许可证分配所做的更改。

  • Log Monitor 应用程序提供几乎全部可用日志数据,并能够进行趋势分析和故障排除。
  • Sessions Monitor 应用程序显示有关应用程序使用情况的日志数据。
  • Reloads Monitor 应用程序提供有关重新加载数据的详细信息,包括来自 QMC 以及应用中心中打开的应用程序。
  • Sense System Performance Analyzer 应用程序显示跨所有节点的 Qlik Sense 性能。
  • Sense Connector Logs Analyzer 应用程序提供有关特定 Qlik 连接器的使用情况和错误的见解。
  • App Metadata Analyzer 应用程序提供您所有 Qlik Sense 应用程序的整体视图,包括应用程序数据模型及其资源利用的粒度级别的详细信息。

有关更多信息,请参阅监控 Qlik Sense Enterprise on Windows 站点 (仅提供英文版本)

大量数据

在您连接至大量数据时可以采用这些架构策略。

分割

您可按维度(例如时间范围、地区或聚合水平)分割 QVDs。例如,您可具有:

  • QVD,含有最近两年的数据。
  • QVD,含有两年以前的历史数据。
  • QVD,含有在更高级别上聚合的所有数据。例如,按月而不是日期,或者按国家而不是单个客户。

  • 含有所有数据的一个大型 QVD,其仅由一小部分用户使用。

你可以用类似的方法来细分应用程序。较小的应用程序将满足大多数用户的分析需求。这样可节省内存。

您也可拥有专注于不同地区的多个应用程序。由此,用户将不会打开包含自己不感兴趣的数据或没有数据访问权限的应用程序。无法经由区域权限访问的数据也会影响内存。

On-Demand 应用程序生成 (ODAG)

Qlik Sense On-Demand 应用程序为用户提供大数据存储的聚合视图。它们可识别并加载相关的数据子集,以进行详细分析。

从用户的角度而言,有两个应用程序:

  1. 含有聚合数据的购物车。
  2. 用于显示详细信息的空模板应用程序。

用户在购物车应用程序中进行选择。一旦达到阈值,就会创建自定义 LOAD 脚本,该脚本用请求的详细信息填写模板应用程序。有关更多信息,请参阅 通过 On-demand 应用程序管理大数据

文档链接

文档链接意味着存在用户定期使用的聚合应用程序。如果用户需要更多详细信息,可将所做选择从聚合应用程序传递至详细信息应用程序,从而他们可以更低粒度级别进行查看。这样可节省内存,因为用户没有加载不必要的详细信息。文档链接经由 APIs 受到支持。

数据模型性能

以下是可影响数据模型性能的指标。每一个都是将改善应用程序可用性的最佳实践。

数据模型性能最佳实践
操作 说明

删除合成钥

在两个或更多数据表共有两个或更多字段时,Qlik Sense 会创建合成钥。这可能意味着脚本或数据模型中存在错误。要诊断合成钥,请参阅合成钥

从数据模型删除循环引用

当两个字段具有多个关联时,会发生循环引用。Qlik Sense 将尝试通过更改与其中一个表格之间的连接来解决这些问题。不过,应当解决所有循环引用警告,请参阅了解并解决循环引用

适当的数据粒度

您应当只加载必要的数据。例如:用户组仅需要按周、月和年划分的数据。您可在聚合的数据中加载,或在加载脚本中聚合数据以节省内存。如果用户确实需要可视化粒度级别较低的数据,可使用 ODAG 或文档链接。

尽可能使用 QVDs

QVD 文件包含从 Qlik Sense 中导出的数据表。当从脚本中读取数据时,该文件格式可提升速度,同时又非常紧凑。从 QVD 文件读取数据通常比从其他数据源读取快 10 到 100 倍。有关更多信息,请参阅使用 QVD 文件

在加载时优化 QVD 文件

QVD 文件可以用两种模式读取:标准(快速)和优化 (超快)。所选模式由脚本引擎自动确定。

对于优化的加载存在一些限制。可重命名字段,但任何这些操作将导致标准加载:

  • 加载的字段上的任何转换。
  • 使用 where 子句使得 Qlik Sense 将记录解压。
  • 在加载的字段上使用映射

利用增量加载

如果应用程序连接至不断更新的数据库中的大量数据,则加载整个数据集可能会非常耗时。您应当改为使用增量加载,以在数据库中检索新的或已更改的记录。有关详细信息,请参阅加载新的和更新的记录与增量加载

合并 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 语句将值转换为符号键。 有关更多信息,请参阅AutoNumberAutoNumber

避免数据岛

数据岛可能会有用,但通常会影响性能。如果您为选择项值创建岛,则使用变量。

基于增量时间范围存储 QVD

您应当分段存储 QVD,如每月。然后这些较小的月度 QVD 可支持可能不需要所有数据的许多不同应用程序。

工作表性能

这些是将会改善工作表和可视化性能的最佳实践。

工作表性能最佳实践
操作 说明

尽可能避免 If() 函数

如果在聚合函数中使用 If() 函数,则该函数将在记录级别上运行并被多次求值。

例如,如果您在聚合中有 1000 个记录,将计算 If() 条件 1000 次。如果您嵌套语句,这可能迅速级联。您应当改为使用集合分析。在聚合之前应用集合分析筛选器,可实现更快的响应。这些响应也可经由集合分析缓存,而 If() 无法实现。您还可考虑对数据模型使用其他函数和修改。

尽可能避免来自聚合表中不同表中的字段。

计算聚合时,计算将通过两个步骤进行:

  1. 第一步是找到相关的组合,并根据这些组合进行计算。该步骤是单线程的。

  2. 第二个步骤是执行计算。该步骤是多线程的。

单线程部分会对性能产生很大影响。一个示例是聚合中有多个字段,例如 Sum(Quantity*ListPrice)。如果 Quantity 在事实表中,并且 ListPrice 在主产品表中,引擎首先需要连接两个表以找到组合,然后才能开始将产品求和。联接为单线程部分,求和为多线程部分。如果两个字段都在同一个表中,则不需要联接,并且聚合的计算速度要快得多。

尽量少使用 Aggr() 和嵌套的 Aggr() 函数

Aggr() 函数对性能影响很大。不当使用可造成结果不准确。例如,在维度与 Aggr() 函数中的维度不同的表格中。有关详细信息,请参阅何时不应当使用 AGGR?

尽可能使用集合分析

您可使用集合分析来定义与当前选择项定义的一般集合不同的数据值集合。有关详细信息,请参阅集合分析和集合表达式

尽可能避免字符串比较

字符串比较的效果不如集合分析。例如,您应当避免 Match()MixMatch()WildMatch()Pick()。可改为在脚本中创建标记或使用集合分析。有关详细信息,请参阅条件函数条件聚合的性能

用于包含密集计算的对象上的计算条件

当不存在选择项时,您能可视化许多记录。最佳实践是向对象添加计算条件,从而它们仅在进行特定选择后呈现。这样可避免创建非常大的超立方体。例如:GetSelectedCount([Country])=1 OR GetPossibleCount([Country])=1。在该场景中,除非用户选择单一国家/地区,或进行只能有一个国家/地区的其他选择,否则可视化将不会呈现。

尽可能在脚本中预先计算度量值

应当在脚本中计算数据模型中最低粒度级别上的任何度量值。例如,如果在表格中的同一记录有 SalesCost,则您可通过计算 Sales - Cost AS Margin 衍生利润值。如果您了解不会根据选择变化或绑定到不同粒度级别的其他值,则还可提前聚合这些值。

列数不到 15 并且具有计算条件的表格

列数达到 15 的表格可被视为宽表格。如果您的表格由许多记录组成,则应当在表格对象上使用计算的条件,从而该表格对象仅在符合特定选择或条件之后呈现。如果您的表格非常宽,可考虑:

  • 创建多个根据条件显示的较小表格。
  • 使用方法以有条件显示列。
  • 让您的表格仅保留对您的分析必要的字段。

工作表没有过量的对象

当用户导航至工作表时计算对象。每次用户在该工作表上进行选择时,如果缓存中不存在对象的当前状态,则将重新计算相应的每个对象。如果您具有含许多图表的工作表,用户几乎不得不在每次选择时等待每个对象进行计算。这将给引擎造成明显的负担。最佳的实践是遵照 Dashboard/Analysis/Reporting (DAR) 概念,开发简洁而且尽量小的应用程序。有关详细信息,请参阅 DAR 方法

在脚本中使用数字标记以供在集合分析中使用

具有标记的集合分析可能比使用字符串比较或乘法更有效。

将主条目或变量用于表达式

主条目可实现受管理度量的拖放并保证将表达式缓存。例如,Sum(Sales)SUM(Sales) 不同。表达式的拼写和大小写都会被缓存,需要逐字匹配才能重新使用。