缓存查询

当之前的 SQL 查询的缓存结果可用且缓存政策允许时,Looker 会使用这些缓存结果,从而减轻数据库的负载并提升性能。本页介绍了 Looker 的默认缓存政策,以及用于修改 Looker 实例中缓存结果时长的可用选项。

Looker 如何使用缓存的查询

对于 SQL 查询,Looker 中的缓存机制的运作方式如下:

  1. 从探索、数据洞见或信息中心运行 SQL 查询时,Looker 会检查缓存,以查看是否已缓存该查询的结果。只有在查询的所有方面(包括字段、过滤条件、参数和行数限制)都相同的情况下,系统才会使用缓存的结果。

  2. 如果找到缓存的结果,Looker 会检查 LookML 模型中定义的缓存政策,以确定缓存的结果是否已过期。如果缓存的结果未过期,Looker 会使用缓存的查询结果。

  3. 如果未找到查询的缓存结果,或者缓存结果已过期,Looker 将对数据库运行查询。然后,系统会缓存新的查询结果。

默认缓存保留政策为 1 小时。下一部分(修改缓存保留政策)将介绍如何缩短或延长此时长,以及将缓存保留政策同步到数据库的 ETL(提取、转换和加载)流程的选项。

修改缓存保留政策

您可以在 LookML Explore 级别和 LookML 模型级别指定缓存保留政策。

建议的缓存机制是在模型级别使用 datagroup 参数。借助数据集,您可以使用 sql_trigger 参数并使用 max_cache_age 参数设置缓存过期间隔,将模型的缓存保留政策与数据库的 ETL 时间表同步。如需了解详情,请参阅使用数据集缓存查询和重新构建 PDT 部分。

如需采用更简单的方法,您可以改为在模型级探索级使用 persist_for 参数。通过这种方式使用 persist_for 参数,您可以设置缓存到期时间间隔,以替换默认的 1 小时间隔。不过,出于一些原因,使用 persist_for 不如使用 datagroup 稳健,如使用 persist_for 缓存查询部分所述。

如果探索或模型定义了 datagroup 或 persist_for,则缓存政策会按如下方式进行修改:

  • persist_for 间隔或数据集的 max_cache_age 间隔到期之前:如果重新运行查询,Looker 会从缓存中提取数据。
  • persist_for 间隔或数据集群的 max_cache_age 间隔到期时:Looker 会从缓存中删除数据。
  • persist_for 间隔或数据集群的 max_cache_age 间隔过期后:如果重新运行查询,Looker 会直接从数据库中提取数据,并重置 persist_formax_cache_age 间隔。

这里有一个关键点,即当 persist_formax_cache_age 间隔期到期时,系统会从缓存中删除数据。

如果缓存达到存储限制,系统会根据最近最少使用 (LRU) 算法逐出数据,但无法保证会一次性删除已过期 persist_formax_cache_age 间隔的数据。

最大限度地缩短数据在缓存中停留的时间

Looker 始终会将查询结果写入缓存。即使将 persist_formax_cache_age 间隔设置为零,缓存的数据最多仍可存储 10 分钟。存储在磁盘缓存中的所有客户数据均采用高级加密标准 (AES) 加密。

如需尽可能缩短数据在缓存中存储的时间,请执行以下操作:

  • 对于任何 persist_for 参数(适用于模型或探索)或 max_cache_age 参数(适用于数据集),请将值设置为 0 minutes。当 persist_for 间隔期到期或数据达到其数据组中指定的 max_cache_age 间隔期时,Looker 会删除缓存。(无需将 PDT 的 persist_for 参数设置为 0 minutes,即可最大限度地减少存储在缓存中的数据量。PDT 会写入数据库本身,而不是缓存。)
  • suggest_persist_for 参数设置为较小的间隔时间。suggest_persist_for 值指定 Looker 应将过滤条件建议保留在缓存中多长时间。过滤器建议基于对要过滤的字段值的查询生成。这些查询结果会保留在缓存中,以便 Looker 在用户在过滤条件文本字段中输入内容时快速提供建议。默认情况下,系统会将过滤条件建议缓存 6 小时。如需尽可能缩短数据在缓存中停留的时间,请将 suggest_persist_for 值设为较低的值,例如 5 minutes

检查查询是否从缓存返回

Explore 窗口中,您可以通过运行查询后查看 Run 按钮旁边的信息,确定查询是否已从缓存返回。

从缓存返回查询时,系统会显示“from cache”文本。否则,系统会显示返回查询所花费的时间。

强制从数据库生成新结果

探索窗口中,您可以强制从数据库中检索新结果。运行查询(包括合并的结果查询)后,从探索操作齿轮菜单中选择清除缓存并刷新选项。

使用数据群组缓存查询和重新构建 PDT

使用 datagroup 可协调数据库的 ETL(提取、转换和加载)时间表与 Looker 的缓存政策和 PDT 重新构建时间表。

您可以使用数据集群根据向数据库添加新数据的时间来指定 PDT 的重建触发器。然后,您可以将相同的数据集应用于探索或模型,以便在 PDT 重新构建时缓存的结果也会过期。

或者,您也可以使用数据集将 PDT 重新构建触发器与缓存最长期限分离。如果您的探索基于更新频率非常高的数据,并且联接到重建频率较低的 PDT,这将非常有用。在这种情况下,您可能希望查询缓存的重新设置频率高于 PDT 的重新构建频率。

定义数据组

模型文件或自己的 LookML 文件中,使用 datagroup 参数定义数据集群。如果您希望为项目中的不同探索和/或 PDT 采用不同的缓存和 PDT 重新构建政策,可以定义多个数据群组。

datagroup 参数可以具有以下子参数:

  • label - 为数据集群指定可选标签。
  • description - 为数据集群指定可选说明,该说明可用于说明数据集群的用途和机制。
  • max_cache_age - 指定用于定义时间段的字符串。当查询缓存的存在时间超过相应时间段时,Looker 会使缓存失效。下次发出查询时,Looker 会将查询发送到数据库以获取最新结果。
  • sql_trigger - 指定一个返回包含一个列的一行的 SQL 查询。如果查询返回的值与查询的先前结果不同,则数据集群会进入触发状态。
  • interval_trigger - 指定触发数据集的时间安排,例如 "24 hours"

数据集群至少必须包含 max_cache_age 参数、sql_trigger 参数或 interval_trigger 参数。

以下示例中的数据集群设置了 sql_trigger,以便每天重新构建 PDT。此外,max_cache_age 会设置为每两个小时清除一次查询缓存,以防任何探索分析法将 PDT 与刷新频率高于每天一次的其他数据联接。

datagroup: customers_datagroup {
  sql_trigger: SELECT DATE(NOW());;
  max_cache_age: "2 hours"
}

定义数据集组后,您可以将其分配给探索和 PDT:

使用数据集群为 PDT 指定重新构建触发器

如需使用数据集组定义 PDT 重新构建触发器,请使用 sql_triggerinterval_trigger 子参数创建 datagroup 参数。然后,使用 PDT 的 derived_table 定义中的 datagroup_trigger 子参数将数据组分配给各个 PDT。如果您为 PDT 使用 datagroup_trigger,则无需为派生表指定任何其他持久化策略。如果您为 PDT 指定多个持久化策略,则会在 Looker IDE 中收到警告,并且系统只会使用 datagroup_trigger

以下是使用 customers_datagroup 数据群组的 PDT 定义示例。此定义还在 customer_idfirst_order_date 中添加了多个索引。如需详细了解如何定义 PDT,请参阅 Looker 中的派生表文档页面。

view: customer_order_facts {
  derived_table: {
    sql: ... ;;
    datagroup_trigger: customers_datagroup
    indexes: ["customer_id", "first_order_date"]
  }
}

如需详细了解数据集群如何与 PDT 搭配使用,请参阅 Looker 中的派生表文档页面。

使用数据集群指定探索的查询缓存重置

触发数据集群后,Looker regenerator 会重新构建将该数据集群用作持久化策略的 PDT。重新构建数据集群的 PDT 后,Looker 会清除使用数据集群的重新构建的 PDT 的探索的缓存。如果您想为数据集自定义查询缓存重置时间表,可以将 max_cache_age 参数添加到数据集定义中。除了 Looker 在重新构建数据集群的 PDT 时执行的自动查询缓存重置之外,您还可以使用 max_cache_age 参数按指定时间表清除查询缓存。

如需使用数据集组定义查询缓存政策,请创建包含 max_cache_age 子参数的 datagroup 参数。

如需指定要用于在探索中重置查询缓存的数据集,请使用 persist_with 参数:

  • 如需将数据集群指定为模型中所有探索的默认数据集群,请在模型级(模型文件中)使用 persist_with 参数
  • 如需将数据集分配给各个探索,请在 explore 参数下使用 persist_with 参数

以下示例展示了在模型文件中定义的名称为 orders_datagroup 的数据集群。该数据集群包含一个 sql_trigger 参数,该参数指定将使用查询 select max(id) from my_tablename 来检测 ETL 何时发生。即使该 ETL 一段时间内不会运行,数据集群的 max_cache_age 也会指定缓存数据的使用期限最多为 24 小时。

模型的 persist_with 参数指向 orders_datagroup 缓存政策,这意味着这将是模型中所有探索的默认缓存政策。不过,我们不想为 customer_factscustomer_background“探索”使用模型的默认缓存政策,因此可以添加 persist_with 参数,为这两个“探索”指定不同的缓存政策。ordersorders_facts“探索”没有 persist_with 参数,因此它们将使用模型的默认缓存政策:orders_datagroup

datagroup: orders_datagroup {
  sql_trigger: SELECT max(id) FROM my_tablename ;;
  max_cache_age: "24 hours"
}

datagroup: customers_datagroup {
  sql_trigger: SELECT max(id) FROM my_other_tablename ;;
}

persist_with: orders_datagroup

explore: orders { ... }

explore: order_facts { ... }

explore: customer_facts {
  persist_with: customers_datagroup
  ...
}

explore: customer_background {
  persist_with: customers_datagroup
  ...
}

如果同时指定 persist_withpersist_for,您会收到验证警告,并且系统会使用 persist_with

使用数据群组触发定期提交

数据集群组还可用于触发信息中心数据分析视图的传送。选择此选项后,Looker 会在数据集完成时发送您的数据,以便安排的内容保持最新状态。

使用管理面板处理数据集

如果您拥有 Looker 管理员角色,则可以使用管理面板的数据集页面查看现有数据集。您可以查看每个数据集群的连接、模型和当前状态,以及每个数据集群的标签和说明(如果在 LookML 中指定)。您还可以重置数据集群的缓存、触发数据集群,或前往数据集群的 LookML。

使用 persist_for 缓存查询

模型级探索级使用 persist_for 参数可修改 Looker 的默认缓存保留间隔时间(1 小时)。您可以设置最短 0 minutes 的间隔时间,也可以设置最长 8760 hours(1 年)或更长的间隔时间。

定义数据集相比,定义 persist_for 参数更快、更简单,但不太可靠。建议使用数据集群,而不是 persist_for,原因如下:

  • 数据集群可以与数据库的 ETL 流程同步。
  • 您可以在多个模型和探索中重复使用数据集。这意味着,您可以更新数据集群的 max_cache_age,系统会更新使用该数据集群的每个位置的缓存政策。
  • 您可以在数据集页面中清除与数据集关联的所有缓存。