这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

在查询运行时管理资源

资源管理器估算运行查询所需的资源,然后确定查询的优先级。您可以通过多种方式控制资源管理器如何确定查询执行的优先级:

1 - 为资源池设置运行时优先级

对于每个资源池,可以管理分配给正在运行的查询的资源。您可以为每个资源池分配 HIGH、MEDIUM 或 LOW 运行时优先级。这些设置确定了运行查询时资源池中为其分配的运行时资源量(如 CPU 数量和 I/O 带宽)。优先级为 HIGH 的资源池中的查询获得的运行时资源比运行时优先级为 MEDIUM 或 LOW 的资源池中的查询要多。

确定资源池中查询的优先级

虽然运行时优先级有助于管理资源池的资源,但有些情况下,您可能希望资源池内具有一定灵活性。例如,您可能希望确保每个短小查询都以高优先级运行,同时确保所有其他查询以中等或低优先级运行。

资源管理器可以为资源池设置运行时优先级阈值,从而提供这种灵活性。使用此阈值,您可以指定一个时间限制(以秒为单位),查询必须在该时间限制内完成,否则会被分配资源池的运行时优先级。所有查询在开始运行时优先级均为 HIGH;当查询的持续时间超过运行时优先级阈值中指定的时间限制后,将为其分配资源池的运行时优先级。

设置运行时优先级和运行时优先级阈值

通过使用 CREATE RESOURCE POOLALTER RESOURCE POOL 设置两个资源池参数,指定运行时优先级和运行时优先级阈值:

  • RUNTIMEPRIORITY

  • RUNTIMEPRIORITYTHRESHOLD

2 - 更改正在运行的查询的运行时优先级

CHANGE_CURRENT_STATEMENT_RUNTIME_PRIORITY 允许您更改查询的运行时优先级。您可以更改已在执行的查询的运行时优先级。

此函数具有两个实参:

  • 查询的事务 ID(从系统表中获取) SESSIONS

  • 所需的优先级,以下字符串值之一:HIGHMEDIUMLOW

限制

超级用户可以将任何查询的运行时优先级更改为任何优先级。对于其他用户,以下限制适用:

  • 他们只能更改其各自查询的运行时优先级。

  • 他们不能将查询的运行时优先级提高至高于资源池的优先级。

过程

更改查询的运行时优先级涉及到一个两步过程:

  1. 通过查询系统表 SESSIONS 来获取查询的事务 ID。例如,以下语句返回有关所有正在运行的查询的信息:

    => SELECT transaction_id, runtime_priority, transaction_description from SESSIONS;
    
  2. 运行 `CHANGE_CURRENT_STATEMENT_RUNTIME_PRIORITY```,指定查询的事务 ID 和所需的运行时优先级:

    => SELECT CHANGE_CURRENT_STATEMENT_RUNTIME_PRIORITY(45035996273705748, 'low')
    

3 - 手动将查询移至不同的资源池

数据库管理员可以使用 MOVE_STATEMENT_TO_RESOURCE_POOL 元函数将查询移至另一个执行当中的资源池。

如果某一个查询正在使用大量资源,您可能希望利用这一功能,以防止执行较小的查询。

当查询移至另一个资源池时会发生什么情况

将查询从一个资源池移至另一个资源池时,如果目标池具有足以容纳传入查询的资源,该查询便会继续执行。如果在目标池中无法至少在一个节点上分配足够的资源,则 Vertica 会取消该查询并尝试重新计划查询。如果 Vertica 无法重新计划查询,则该查询将被无限期地取消。

当您成功将查询移至目标资源池后,该查询的资源将由目标池提供,而在第一个池中占用的资源将被释放。

如果将查询移至具有 PRIORITY HOLD 的资源池,Vertica 会取消该查询并将其排入目标池的队列中。在您更改 PRIORITY 或将查询移至另一个没有 PRIORITY HOLD 的资源池之前,该取消状态将一直有效。如果要存储长时间运行的查询以便日后使用,可使用此选项。

若要确定目标池能否容纳要移动的查询,可查看 RESOURCE_ACQUISITIONSRESOURCE_POOL_STATUS 系统表。请注意,当您查询系统表时以及调用 MOVE_STATEMENT_TO_RESOURCE_POOL 元函数时,这些表可能发生变化。

当查询从一个资源池成功移至另一个执行当中的资源池时,该查询会一直执行,直至达到现有 RUNTIMECAP 和新 RUNTIMECAP 之间的较大者为止。例如,如果初始池的 RUNTIMECAP 大于目标池,则查询可在达到初始 RUNTIMECAP 之前一直执行。 当查询从一个资源池成功移至另一个执行当中的资源池时,CPU 关联性将改变。

使用 MOVE_STATEMENT_TO_RESOURCE_POOL 函数

若要手动将查询从其当前资源池移至另一资源池,请使用 MOVE_STATEMENT_TO_RESOURCE_POOL 元函数。如下所示提供会话 ID、事务 ID、语句 ID 和目标资源池名称:

=> SELECT MOVE_STATEMENT_TO_RESOURCE_POOL ('v_vmart_node0001.example.-31427:0x82fbm', 45035996273711993, 1, 'my_target_pool');

另请参阅: