定义辅助资源池

您可以定义正在运行的查询在超出初始资源池的 RUNTIMECAP 时可以级联到的辅助资源池。

确定辅助池

通过定义辅助资源池,您可以指定一个位置,超出正在运行查询的资源池的 RUNTIMECAP 的查询可以在该位置执行。这样,如果某个查询超出池的 RUNTIMECAP,该查询可级联至具有更大 RUNTIMECAP 的池,而不会导致错误。当查询级联到另一个池时,原始池将重新获得此查询使用的内存。

因为不考虑在辅助池上授予权限,所以您可以使用此功能为用户查询指定辅助资源池而无需为用户提供在该池上运行查询的明确权限。

您还可使用辅助池来存储长时间运行的查询,以便日后使用。使用 PRIORITY HOLD 选项,您可以指定一个对队列重新排队的辅助池,直至达到 QUEUETIMEOUT 或者池的优先级更改为非保留值。

在 Eon 模式下,为特定于子群集的资源池定义辅助资源池时,需遵循以下限制:

  • 全局资源池只能级联到其他全局资源池。

  • 特定于子群集的资源池可以级联到全局资源池,或级联到属于同一子群集的另一个特定于子群集的资源池。如果子群集特定资源池级联到全局和子群集级别中均具有的用户定义资源池,则优先子群集级别资源池。例如:

    => CREATE RESOURCE POOL billing1;
    => CREATE RESOURCE POOL billing1 FOR CURRENT SUBCLUSTER;
    => CREATE RESOURCE POOL billing2 FOR CURRENT SUBCLUSTER CASCADE TO billing1;
    WARNING 9613:  Resource pool billing1 both exists at both subcluster level and global level, assuming subcluster level
    CREATE RESOURCE POOL
    

查询级联路径

当达到初始池上的 RUNTIMECAP 时,Vertica 会将查询路由到辅助池。然后,Vertica 检查辅助池的 RUNTIMECAP 值。如果辅助池的 RUNTIMECAP 大于初始池的值,查询将在辅助池上执行。如果辅助池的 RUNTIMECAP 小于或等于初始池的值,Vertica 将在链中的下一个池上重新尝试查询,直至找到一个 RUNTIMECAP 大于初始池值的池。如果此时辅助池没有足够的可用资源来执行查询,SELECT 查询可能会在该池上重新排队、重新计划和中止。其他类型的查询会因为资源不足而失败。如果查询不存在合适的辅助池,查询将出现错误。

下图演示了执行查询时采用的路径。

查询执行时间分配

在 Vertica 找到用于运行查询的相应池之后,它会继续不间断地执行该查询。现在,查询在用于完成查询的两个池的 RUNTIMECAP 限制方面存在一些差异:

query execution time allocation = rp2 RUNTIMECAP - rp1 RUNTIMECAP

使用 CASCADE TO 参数

作为 超级用户,您可以使用 CREATE RESOURCE POOLALTER RESOURCE POOL 语句中的 CASCADE TO 参数来识别辅助池。辅助池必须已作为用户定义的池或 GENERAL 池存在。使用 CASCADE TO 时,不能创建资源池循环。

此示例说明了一个场景,其中管理员希望 user1 的查询在 user_0 资源池上启动,但在查询过长时级联到 userOverflow 池。


=> CREATE RESOURCE POOL userOverflow RUNTIMECAP '5 minutes';
=> CREATE RESOURCE POOL user_0 RUNTIMECAP '1 minutes' CASCADE TO userOverflow;
=> CREATE USER "user1" RESOURCE POOL user_0;

在此场景中,user1 无法在 userOverflow 资源池上启动他或她的查询,但由于不考虑为辅助池授予权限,因此如果辅助池超出 user_0 池的 RUNTIMECAPuser1 的查询可以级联到 userOverflow 池。使用辅助池会释放主要池中的空间,因此可以运行简短的查询。

此示例显示了一个场景,即管理员想要长时间运行的查询在辅助池上保持排队状态。

=> CREATE RESOURCE POOL rp2 PRIORITY HOLD;
=> CREATE RESOURCE POOL rp1 RUNTIMECAP '2 minutes' CASCADE TO rp2;
=> SET SESSION RESOURCE_POOL = rp1;

在此场景中,在 rp1 上运行超过 2 分钟的查询将在 rp2 上排队,直至达到 QUEUETIMEOUT,此时查询将被拒绝。

如果您尝试删除的资源池是另一个资源池的辅助池,则 Vertica 会返回一个错误。该错误会列出与您尝试删除的辅助池有关的资源池。要删除辅助资源池,首先在主要资源池上将 CASCADE TO 参数设置为 DEFAULT,然后再删除辅助池。

例如,可以删除资源池 rp2,它是 rp1 的辅助池,如下:

=> ALTER RESOURCE POOL rp1 CASCADE TO DEFAULT;
=> DROP RESOURCE POOL rp2;

参数注意事项

当查询进入辅助池时,该池的 CPUAFFINITYSETCPUAFFINITYMODE 会应用于该查询。

查询会根据以下情况在不同时间采用辅助池的 RUNTIMEPRIORITY

  • 如果当查询在主要池中运行时未启动 RUNTIMEPRIORITYTHRESHOLD 计时器,查询会在级联时采用辅助池的 RUNTIMEPRIORITY。当未设置主要池的 RUNTIMEPRIORITYTHRESHOLD 时或者将主要池的 RUNTIMEPRIORITY 设置为 HIGH 时,即会发生上述情况。

  • 如果达到主要池的 RUNTIMEPRIORITYTHRESHOLD,查询会在级联时采用辅助池的 RUNTIMEPRIORITY

  • 如果未达到主要池的 RUNTIMEPRIORITYTHRESHOLD 并且辅助池没有阈值,查询会在级联时采用新池的 RUNTIMEPRIORITY

  • 如果未达到主要池的 RUNTIMEPRIORITYTHRESHOLD 并且辅助池设置了一个阈值:

    • 如果主要池的RUNTIMEPRIORITYTHRESHOLD 大于或等于辅助池的 RUNTIMEPRIORITYTHRESHOLD,查询在达到主要池的 RUNTIMEPRIORITYTHRESHOLD 之后会采用辅助池的 RUNTIMEPRIORITY

      例如: RUNTIMECAP (主要池)为 5 秒
      RUNTIMEPRIORITYTHRESHOLD (主要池)为 8 秒
      RUNTIMTPRIORITYTHRESHOLD (辅助池)为 7 秒

      在这种情况下,查询会在主要池上运行 5 秒,然后级联到次要池。再过去 3 秒(总共 8 秒)后,查询会采用次要池的 RUNTIMEPRIORITY

    • 如果主要池的 RUNTIMEPRIORITYTHRESHOLD 小于辅助池的 RUNTIMEPRIORITYTHRESHOLD,查询在达到辅助池的 RUNTIMEPRIORITYTHRESHOLD 之后将采用辅助池的 RUNTIMEPRIORITY

      例如,主要池的
      RUNTIMECAP = 5 秒
      RUNTIMEPRIORITYTHRESHOLD (主要池)为 8 秒
      RUNTIMTPRIORITYTHRESHOLD (辅助池)为 12 秒

      在这种情况下,查询会在主要池上运行 5 秒,然后级联到次要池。再过去 7 秒(总共 12 秒)后,查询会采用次要池的 RUNTIMEPRIORITY