Looker 会使用之前 SQL 查询的缓存结果(如果可用且缓存政策允许此功能),从而减少数据库的负载并提高性能。本页面介绍了 Looker 的默认缓存政策,以及用于修改 Looker 实例上缓存结果时长的可用选项。
Looker 如何使用缓存的查询
对于 SQL 查询,Looker 中的缓存机制的工作方式如下:
当从探索、Look 或信息中心运行 SQL 查询时,Looker 会检查缓存,以查看该查询是否已有缓存结果。只有当查询的所有方面都相同时(包括字段、过滤条件、参数和行数限制),才会使用缓存结果。
如果找到缓存结果,Looker 会检查 LookML 模型中定义的缓存政策,以确定缓存结果是否已过期。如果缓存结果未过期,Looker 会将缓存结果用于查询。
如果未找到查询的缓存结果,或者缓存结果已过期,Looker 会针对数据库运行查询。然后,新的查询结果将被缓存。
默认缓存保留政策为 1 小时。下一部分“修改缓存保留政策”讨论了如何缩短或延长此时间,并介绍了如何将缓存保留政策与数据库的 ETL(提取、转换和加载)流程同步。
修改缓存保留政策
您可以在 LookML 探索级别和 LookML 模型级别指定缓存保留政策。
建议的缓存机制是在模型级别使用 datagroup 参数。借助数据组,您可以使用 sql_trigger
参数将模型的缓存保留政策与数据库的 ETL 时间表同步,并使用 max_cache_age 参数设置缓存过期间隔。如需了解详情,请参阅使用数据组缓存查询和重建永久性派生表 (PDT) 部分。
为了简化方法,您可以改为在 persist_for 参数在 模型级别 或 探索级别 使用。以这种方式使用 persist_for
参数可让您设置缓存过期间隔,以替换默认的 1 小时间隔。不过,由于一些原因,使用 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_for或max_cache_age间隔。
这里的一个关键点是,当 persist_for 或 max_cache_age 间隔过期时,数据会从缓存中删除。
如果缓存达到存储空间限制,系统会根据最近最少使用 (LRU) 算法逐出数据,并且无法保证过期 persist_for 或 max_cache_age
间隔的数据会一次性全部删除。
最大限度缩短数据在缓存中停留的时间
Looker 始终会将查询结果写入缓存。即使 persist_for 和 max_cache_age
间隔设置为零,缓存的数据也可能会存储长达 10 分钟。存储在磁盘缓存中的所有客户数据都经过高级加密标准 (AES) 加密。
如需最大限度缩短数据在缓存中存储的时间,请执行以下操作:
- 对于任何
persist_for参数(针对模型或探索)或max_cache_age参数(针对数据组),将值设置为0 minutes。Looker 会在persist_for间隔过期时,或者在数据达到其 数据组 中指定的max_cache_age间隔时删除缓存。(无需将永久性派生表 (PDT) 的persist_for参数设置为0 minutes,即可最大限度缩短存储在缓存中的数据量。PDT 会写入数据库本身,而不是缓存。) - 将
suggest_persist_for参数设置为较小的间隔。suggest_persist_for值用于指定 Looker 应在缓存中保留过滤条件建议的时长。过滤条件建议基于对正在过滤的字段的值的查询。这些查询结果会保留在缓存中,以便 Looker 在用户在过滤条件文本字段中输入内容时快速提供建议。默认情况下,过滤条件建议会缓存 6 小时。如需最大限度缩短数据在缓存中停留的时间,请将suggest_persist_for值设置为较低的值,例如5 minutes。
检查查询是否从缓存返回
在“探索”窗口中,您可以在运行查询后查看运行按钮旁边的信息,以确定查询是否从缓存返回。
如果查询从缓存返回,则会显示文本“from cache”。否则,系统会显示返回查询所用的时间。
强制从数据库生成新结果
在“探索”窗口中,您可以强制从数据库检索新结果。运行查询(包括 合并结果 查询)后,从 探索操作 齿轮菜单中选择 清除缓存并刷新 选项。
使用数据组缓存查询和重建永久性派生表 (PDT)
使用数据组协调数据库的 ETL(提取、转换和加载)时间表与 Looker 的缓存政策和永久性派生表 (PDT) 重建时间表。
您可以使用数据组根据向数据库添加新数据的时间指定 PDT 的重建触发器。然后,您可以将相同的数据组应用于探索或模型,以便缓存结果在 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,请使用
datagroup_trigger参数下的derived_table参数。如需查看示例,请参阅本页面上的使用数据组指定 PDT 的重建触发器部分。 - 如需将数据组分配给探索,请在 模型级别 或 探索级别 使用
persist_with参数。如需查看示例,请参阅本页面上的使用数据组指定探索的查询缓存重置部分。
使用数据组指定 PDT 的重建触发器
如需使用数据组定义 PDT 重建触发器,请使用 datagroup 或 sql_trigger 子参数创建 interval_trigger 参数。然后,使用 PDT 的 datagroup_trigger 定义中的 derived_table 子参数将数据组分配给各个 PDT。如果您为 PDT 使用 datagroup_trigger,则无需为派生表指定任何其他 持久性策略。如果您为 PDT
指定了多个持久性策略,则会在 Looker IDE 中收到警告,并且系统只会使用 datagroup_trigger。
以下示例展示了使用 customers_datagroup 数据组的 PDT 定义。此定义还为 customer_id 和
first_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 参数添加到数据组定义中。除了 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_facts 和 customer_background 探索使用模型的默认缓存政策,因此我们可以添加 persist_with 参数,为这两个探索指定不同的缓存政策。orders 和 orders_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_with 和 persist_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,并且它将在使用该数据组的每个位置更新缓存政策。 - 您可以从“数据组”页面清除与数据组关联的所有缓存。