Looker 使用先前 SQL 查询的缓存结果(当可用且您的缓存政策允许此函数时),可减少数据库的负载并提升性能。本页面介绍了 Looker 的默认缓存政策,以及用于修改 Looker 实例上缓存结果时长的可用选项。
Looker 如何使用缓存的查询
对于 SQL 查询,Looker 中的缓存机制的工作原理如下:
从探索、Look 或信息中心运行 SQL 查询时,Looker 会检查缓存,查看该查询是否已经有缓存的结果。仅当查询的所有方面(包括字段、过滤条件、参数和行数上限)均相同时,系统才会使用缓存的结果。
如果找到缓存的结果,Looker 会检查 LookML 模型中定义的缓存政策,以确定缓存的结果是否已过期。如果缓存结果未过期,则 Looker 会将缓存结果用于查询。
如果未找到用于查询的缓存结果,或者缓存的结果已过期,Looker 将对数据库运行查询。然后,系统会缓存新的查询结果。
默认的缓存保留政策为 1 小时。下一部分(修改缓存保留政策)介绍了如何缩短或延长此时间,并介绍了将缓存保留政策同步到数据库的 ETL(提取、转换和加载)过程的选项。
修改缓存保留政策
您可以在 LookML 探索级别和 LookML 模型级别指定缓存保留政策。
建议的缓存机制是在模型级别使用 datagroup
参数。借助数据组,您可以使用 sql_trigger
参数和使用 max_cache_age
参数设置缓存到期间隔,从而将模型的缓存保留政策与数据库的 ETL 时间表同步。如需了解详情,请参阅缓存查询和使用数据组重新构建 PDT 部分。
若要采用更简单的方法,您可以改用模型级别或探索级别的 persist_for
参数。以这种方式使用 persist_for
参数时,您可以设置缓存到期间隔,以替换默认的 1 小时间隔。但是,出于一些原因,使用 persist_for
不如使用数据组稳健,如使用 persistent_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
间隔设置为 0,缓存的数据可能仍会存储长达 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
。
检查是否从缓存中返回了查询
在探索窗口中,您可以在运行查询后查看运行按钮旁边的信息,确定是否从缓存中返回了查询。
从缓存返回查询时,系统会显示文本“from cache”。否则,系统会显示返回查询所花费的时间。
强制从数据库生成新结果
在探索窗口中,您可以强制从数据库中检索新结果。运行查询(包括合并的结果查询)后,从浏览操作齿轮菜单中选择清除缓存并刷新选项。
缓存查询并使用数据组重新构建 PDT
使用数据组协调数据库的 ETL(提取、转换和加载)时间表与 Looker 的缓存政策和 PDT 重新构建时间表。
您可以使用数据组,根据新数据添加到数据库的时间来指定用于重新构建 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
参数。
下面是一个数据组示例,其中设置了每天重新构建 PDT 的 sql_trigger
。此外,max_cache_age
设置为每两小时清除一次查询缓存,以防任何探索将 PDT 联接到每天刷新频率超过一次的其他数据。
datagroup: customers_datagroup {
sql_trigger: SELECT DATE(NOW());;
max_cache_age: "2 hours"
}
定义数据组后,可以将其分配给探索和 PDT:
- 如需将数据组分配给 PDT,请使用
derived_table
参数下的datagroup_trigger
参数。如需查看示例,请参阅本页面中的使用数据组为 PDT 指定重新构建触发器部分。 - 若要将数据组分配给“探索”,请在模型级别或探索级别使用
persist_with
参数。如需查看示例,请参阅本页面中的使用数据组为探索指定查询缓存重置部分。
使用数据组为 PDT 指定重新构建触发器
若要使用数据组定义 PDT 重建触发器,请使用 sql_trigger
或 interval_trigger
子参数创建 datagroup
参数。然后,使用 PDT 的 derived_table
定义中的 datagroup_trigger
子参数将数据组分配给各个 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
参数。除了在重新构建数据组的 PDT 时 Looker 执行自动查询缓存重置之外,您还可以使用 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
,原因如下:
- Datagroup 可以与数据库的 ETL 进程同步。
- 您可以在多个模型和探索中重复使用数据组。这意味着,您可以更新数据组的
max_cache_age
,它会在使用该数据组的每个位置更新缓存政策。 - 您可以通过数据组页面清除与数据组关联的所有缓存。