Direct Discovery 数据与内存中数据之间的差别

内存中模型

Qlik Sense 内存中模型中,从加载脚本中的表格中选择的字段中的所有唯一值都已加载到字段结构,并且相关数据也已同时加载到表格中。字段数据和相关数据都保留在内存中。

One table with three fields.

加载到内存的另一个相关表格将共享共同字段,并且该表格可能会将新的唯一值添加到共同字段,也可能会共享现有值。

Two tables with a common field.

Direct Discovery

在使用 Direct Discovery LOAD 语句 (Direct Query) 加载表格字段时,仅使用 DIMENSION 字段创建相似的表格。与使用内存中字段一样,DIMENSION 字段的唯一值会加载到内存中。但是这些字段之间的相关性会保留在数据库中。

One table with two dimension fields.

MEASURE 字段值也会保留在数据库中。

One table with measure field values left in the database.

在建立 Direct Discovery 结构后,Direct Discovery 字段可用于某些可视化对象,并且可用于与内存中字段关联。在使用 Direct Discovery 字段时,Qlik Sense 会自动创建相应的 SQL 查询以对外部数据运行。在选择选择项时,Direct Discovery 字段的相关数据值可用于 WHERE 条件的数据库查询。

使用每个选择项时,会重新计算包含 Direct Discovery 字段的可视化,并且会通过执行 Qlik Sense 创建的 SQL 查询在源数据库表格中进行计算。可以使用计算条件功能指定应重新计算可视化的时间。在满足条件之前,Qlik Sense 不会发送重新计算可视化的查询。

内存中字段与 Direct Discovery 字段之间的性能差别

与在源数据库中处理相比,内存中处理始终更快。Direct Discovery 的性能会反映处理 Direct Discovery 查询的数据库的运行系统性能。

可以为 Direct Discovery 使用标准数据库和查询调整最佳实践。所有性能优化操作都应在源数据库中完成。Direct Discovery 不提供从 Qlik Sense 应用程序进行查询性能调节的支持。但可以使用连接池功能进行数据库异步、并行调用。设置连接池功能的加载脚本语法是:

SET DirectConnectionMax=10;

Qlik Sense 缓存也可以改善整体用户体验。请参阅以下的缓存和 Direct Discovery

通过从关联关系中分离某些字段还可以改善 Direct DiscoveryDIMENSION 字段的效果。为此,可在 DIRECT QUERY 中使用 DETACH 关键字。虽然不查询分离字段的关联情况,但这些字段仍然是筛选的一部分,从而缩短选择时间。

虽然 Qlik Sense 内存中字段和 Direct DiscoveryDIMENSION 字段的所有数据都保留在内存中,但它们的加载方式会影响内存中的加载速度。在有多个同值实例时,Qlik Sense 内存中字段仅保留一个字段值副本。但是,会加载所有字段数据,然后检索出重复数据。

DIMENSION 字段也只存储一个字段值副本,但在加载到内存前会先在数据库中检索出重复值。在处理大量数据时,就像平常一样,使用 Direct Discovery 时,加载数据的速度就像 DIRECT QUERY 加载一样,比通过内存中字段使用的 SQL SELECT 加载快得多。

内存中数据与数据库数据之间的差别

DIRECT QUERY 在与内存中数据建立关联时区分大小写。Direct Discovery 会根据查询的数据库字段的大小写敏感度从源数据库选择数据。如果数据库字段不区分大小写,则 Direct Discovery 查询可能会返回内存中查询没有查询的数据。例如,如果不区分大小写的数据库中存在以下数据,则查询值 "Red"Direct Discovery 查询会返回所有行的内容。

示例表格
ColumnA ColumnB
红色
红色
红色
红色

另一方面,选择 "Red," 的内存中选择仅返回:

Red two

Qlik Sense 可在某种程度上规范化数据,从而生成所选数据的匹配项,数据库不会匹配这些匹配项。因此,与 Direct Discovery 查询相比,内存中查询可能会生成更匹配的值。例如,在下表中,数字 "1" 的值根据其空间位置的不同有所不同:

对于数字 "1" 有不同值的表格,这是因为它们周围不同的空格位置
ColumnA ColumnB
' 1' space_before
'1' no_space
'1 ' space_after
'2'

如果在筛选器窗格中为 ColumnA 选择 "1",其中数据在标准的 Qlik Sense 内存中,则前三行相关联:

Associated rows
ColumnA ColumnB
' 1' space_before
'1' no_space
'1 ' space_after

如果筛选器窗格包含 Direct Discovery 数据,选择 "1" 可能仅关联 "no_space"。为 Direct Discovery 数据返回的匹配项取决于数据库。某些数据仅返回 "no_space",某些数据(比如 SQL Server)返回 "no_space""space_after"

缓存和 Direct Discovery

Qlik Sense 缓存可在内存中存储查询的选择项状态和相关查询结果。在选择相同类型的选择项时,Qlik Sense 会利用缓存中的查询,而不是查询源数据。在选择不同选择项时,将在数据源中执行 SQL 查询。缓存结果将在用户之间共享。

Example:  

  1. 用户应用最初的选择项。

    SQL 会传递到基础数据源。

  2. 用户清除选择,并应用与最初的选择项相同的选择项。

    返回缓存结果,SQL 不会传递到基础数据源。

  3. 用户应用不同的选择项。

    SQL 会传递到基础数据源。

可通过 DirectCacheSeconds 系统变量在缓冲上设置时间限制。一旦达到时间限制,Qlik Sense 会清除为之前的选择生成的 Direct Discovery 查询结果的缓存。然后 Qlik Sense 将查询选择项的源数据并将为指定的时间限制再次创建缓存。

Direct Discovery 查询结果的默认缓存时间是 30 分钟,除非使用 DirectCacheSeconds 系统变量。