缓存查询

当之前的 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 间隔到期或数据达到其 datagroup 中指定的 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)

使用数据集可协调数据库的 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,系统会更新使用该数据集群的每个位置的缓存政策。
  • 您可以在数据集群页面中清除与数据集群关联的所有缓存。