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

内存中模型

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

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

Direct Discovery

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

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

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

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

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

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

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

SET DirectConnectionMax=10;

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

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

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

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

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

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

ColumnA ColumnB
red one
Red two
rED three
RED four

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

Red two

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

ColumnA ColumnB
' 1' space_before
'1' no_space
'1 ' space_after
'2' two

如果在列表框中为 ColumnA 选择 "1",其中数据在标准的 QlikView 内存中,则前三行相关联:

' 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

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

示例:  

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

    SQL会传递到基础数据源。

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

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

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

    SQL会传递到基础数据源。

可以使用 DirectCacheSeconds系统变量对缓存设置时间限制。在达到时间限制后,QlikView 会清除为之前的选择项生成的 Direct Discovery 查询结果的缓存。QlikView 之后会在源数据中查询这些选择项,并针对指定的时间限制重新创建缓存。

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