缓存查询

Looker 会在缓存之前 SQL 查询的结果(如果可用)且缓存政策允许使用缓存时,使用这些结果来减少数据库负载并提高性能。本页介绍了 Looker 的默认缓存政策,以及用于修改 Looker 实例上缓存结果时长的可用选项。

Looker 如何使用缓存的查询

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

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

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

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

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

修改缓存保留政策

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

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

为了简化操作,您可以改为在模型级层探索级层使用 persist_for 参数。以这种方式使用 persist_for 参数可让您设置缓存过期时间间隔,以替换默认的一小时间隔。不过,使用 persist_for 的稳健性不如使用数据组,原因有以下几点,如使用 persist_for 缓存查询部分中所述。

如果探索或模型定义了数据组或 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

检查查询是否从缓存中返回

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

当查询从缓存返回时,系统会显示“来自缓存”文本。否则,系统会显示返回查询结果所用的时间。

强制从数据库生成新结果

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

使用数据组缓存查询和重建永久性派生表 (PDT)

使用数据组可协调数据库的 ETL(提取、转换和加载)时间表与 Looker 的缓存政策和持久性派生表 (PDT) 重建时间表。

您可以根据新数据添加到数据库的时间,使用数据组指定 PDT 的重建触发器。然后,您可以将同一数据组应用于您的 Explore 或模型,以便在 PDT 重建时,缓存的结果也会过期。

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

定义数据组

使用 datagroup 参数在模型文件或其自己的 LookML 文件中定义数据组。如果您希望为项目中的不同探索或 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 再生器将重建使用该数据组作为持久性策略的 PDT。重新构建数据组的 PDT 后,Looker 会清除使用该数据组的重新构建的 PDT 的探索的缓存。如果您想为数据组自定义查询缓存重置时间表,可以将 max_cache_age 参数添加到数据组定义中。借助 max_cache_age 参数,除了在数据组的 PDT 重建时 Looker 执行的自动查询缓存重置之外,您还可以按指定的时间表清除查询缓存。

如需使用数据组定义查询缓存政策,请创建包含 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 Explore 没有 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

使用数据组触发预定交付

数据组还可用于触发信息中心Look 的传送。选择此选项后,Looker 会在数据组完成时发送数据,以便确保预定内容是最新的。

使用数据组的管理面板

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

使用 persist_for 缓存查询

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

定义数据组相比,定义 persist_for 参数可能更快、更简单,但可靠性较低。建议使用数据组,而不是 persist_for,原因如下:

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