管理存储库缓存

您可以通过多种方式控制存储库缓存:

您可以使用多个 V_MONITOR 系统表或管理控制台来监控存储库活动和设置

存储库网关参数

Vertica 存储库可以缓存两种类型的数据:

  • 已查询的数据:存储库可通过从公共存储中提取已查询的数据并将其缓存到存储库中来提高查询执行速度。已缓存的数据将保持可用状态,直到被逐出以便为更新的数据腾出空间,或者为更新的查询提取的数据腾出空间。

  • 已加载的数据:存储库可通过临时缓存数据直到将其上传到公共存储,来加快 COPY 等加载操作。

默认情况下,将存储库配置为缓存这两种类型的数据。

以下两个配置参数确定存储库是缓存已查询的数据还是已加载的数据:

这两个参数都可以在会话级别、用户级别和数据库级别进行设置。

如果在会话或用户级别设置,则这些参数可用于隔离不同子群集存储库上的读取和写入活动。例如,可以按如下所示为用户 joerhonda 设置参数 UseDepotForReads 和 UseDepotForWrites:

=> SHOW USER joe ALL;
          name           | setting
-------------------------+---------
 UseDepotForReads        | 1
 UseDepotForWrites       | 0
(2 rows)
=> SHOW USER rhonda ALL;
          name           | setting
-------------------------+---------
 UseDepotForReads        | 0
 UseDepotForWrites       | 1
(2 rows)

鉴于这些用户设置,当 joe 连接到 Vertica 子群集时,他的会话将仅使用当前存储库来处理查询;所有加载操作都会上传到公共存储。相反,rhonda 的会话将仅使用存储库来处理加载操作;所有查询都必须从公共存储中提取数据。

存储库提取

如果已启用存储库以缓存已查询的数据 (UseDepotForReads = 1),您可以使用配置参数 DepotOperationsForQuery 配置它从公共存储中提取数据的方式。此参数具有三个设置:

  • ALL (默认值):从公共存储中提取文件数据,如有必要,通过将现有文件从存储库中逐出来替换它们。

  • FETCHES:仅当空间可用时才从公共存储中提取文件数据;否则,直接从公共存储中读取查询的数据。

  • NONE:请勿将文件数据提取到存储库,而应直接从公共存储中读取查询的数据。

您可以按优先级升序在四个级别设置提取行为:

例如,您可以在数据库级别设置 DepotOperationsForQuery,如下所示:

=> ALTER DATABASE default SET PARAMETER DepotOperationsForQuery = FETCHES;
ALTER DATABASE

此设置适用于所有数据库存储库,除非在其他级别被覆盖。例如,以下 ALTER USER 语句指定了在处理来自用户 joe 的查询时存储库的提取行为:

=> ALTER USER joe SET PARAMETER DepotOperationsForQuery = ALL;
ALTER USER

最后,joe 可以通过在各个查询中包含 DEPOT_FETCH 提示来覆盖他自己的 DepotOperationsForQuery 设置:


SELECT /*+DEPOT_FETCH(NONE)*/ count(*) FROM bar;

逐出存储库数据

通常,Vertica 会根据需要从存储库中逐出数据,以便为新数据提供空间和加快请求处理。在将新数据写入存储库之前,Vertica 会按如下方式对其进行评估:

  • 从公共存储中提取的数据:Vertica 会调整下载大小并相应地从存储库中逐出数据。

  • 从 DML 操作(例如 COPY)上传的数据:Vertica 无法在上传完成之前估计其总大小,因此它会根据需要调整各个缓冲区的大小并从存储库中逐出数据。

在这两种情况下,Vertica 都会评估现有的存储库数据并按优先级降序(最易受到攻击到最不易受到攻击)确定要从如下存储库中逐出的对象:

  1. 为任何新的固定或未固定对象逐出最近最少使用的未固定对象。

  2. 为新的固定对象逐出最近最少使用的固定对象。

固定存储库对象

您可以对数据库对象设置存储库固定策略,以减少它们被逐出的风险。可以在各个子群集或整个数据库上以及不同的粒度级别(表、投影和分区)设置固定策略:

默认情况下,系统会根据需要将固定对象排入从公共存储下载的队列,以执行查询或 DML 操作。SET_DEPOT_PIN_POLICY 函数可以指定覆盖此行为并立即将新固定的对象排入下载队列:将该函数的最后一个布尔值实参设置为 true

在以下示例中,SET_DEPOT_PIN_POLICY_TABLE 会固定表 foo 的数据,并指定立即将数据排入下载队列:

=> SELECT SET_DEPOT_PIN_POLICY_TABLE ('foo', 'default_subluster', true );

使用准则

将一个或多个对象固定在存储库上会影响其保留已提取(已查询)的数据已上传(新加载)的数据。如果固定对象占用的存储库空间过多,则存储库可能无法处理未固定对象上的加载操作。在这种情况下,请将配置参数 UseDepotForWrites 设置为 0,以便将加载操作直接路由到公共存储进行处理。否则,加载操作很可能会返回错误。

为了尽量减少争用存储库的现象,请考虑以下准则:

  • 仅固定 DML 操作和查询中最活跃的对象。

  • 通过在最小的有效级别中设置策略(例如,仅限固定表的活动分区的数据),可以最小化固定数据的大小。

存储库预热

启动时,新节点的存储库为空,而重新启动节点的存储库通常包含必须刷新的陈旧数据。启用存储库预热后,正在启动的节点会抢先加载其存储库,其中包含频繁查询和固定的数据。当节点完成启动并开始执行查询时,它的存储库已经包含了处理这些查询所需的大部分数据。这减少了从公共存储中提取数据的需要,并相应地提高了查询性能。

默认情况下,存储库预热处于禁用状态 (EnableDepotWarmingFromPeers = 0)。节点将按如下所示执行存储库预热:

  1. 节点会检查配置参数 PreFetchPinnedObjectsToDepotAtStartup。如果启用(设置为 1),则节点:

    • 从数据库编录中获取此节点的子群集上固定的所有对象的列表。

    • 将已固定的对象排入队列以进行获取并计算它们的总大小。

  2. 节点会检查配置参数 EnableDepotWarmingFromPeers。如果启用(设置为 1),则节点:

    • 标识可以复制其存储库内容的同一子群集中的对等节点。

    • 在考虑所有已固定的对象后,计算预热存储库中的剩余可用空间。

    • 从对等节点获取最近使用过的对象(可放入存储库)的列表。

    • 将对象排入队列以进行提取。

  3. 如果 BackgroundDepotWarming 处于启用状态(默认设置为 1),则节点会在预热时将已排队的对象加载到其存储库中,并在节点变为活动状态并开始执行查询后继续在后台执行此操作。否则 BackgroundDepotWarming = 0,节点激活将被推迟,直到存储库提取并加载所有已排队的对象为止。

监控存储库

您可以使用多个 V_MONITOR 系统表来监控存储库活动和设置。