手动选择 ECS 策略

当子群集中的节点数大于数据库分片数时,Vertica 查询优化器使用 elastic crunch scaling (ECS) 让所有节点参与处理查询。对于每个分片,优化器使用以下策略之一在其订阅节点之间划分处理分片数据的责任:

优化器会根据查询是否可以利用数据分段而自动选择策略。您可以使用 EXPLAIN 来判断优化器为查询选择的策略。计划解释的顶部说明了 ECS 是否保留分段。例如,这个针对单表的简单查询不需要使用分段,所以使用了 I/O 优化策略:

=> EXPLAIN SELECT employee_last_name,
            employee_first_name,employee_age
            FROM employee_dimension
            ORDER BY employee_age DESC;

                                 QUERY PLAN
--------------------------------------------------------------------------------
 ------------------------------
 QUERY PLAN DESCRIPTION:
 The execution of this query involves non-participating nodes.
 Crunch scaling strategy does not preserve data segmentation
 ------------------------------
. . .

对于使用 JOIN 的较复杂查询,ECS 会使用计算优化策略保留数据分段。查询计划告知您保留了分段:

=> EXPLAIN SELECT sales_quantity, sales_dollar_amount, transaction_type, cc_name
    FROM online_sales.online_sales_fact
    INNER JOIN online_sales.call_center_dimension
    ON (online_sales.online_sales_fact.call_center_key
        = online_sales.call_center_dimension.call_center_key
        AND sale_date_key = 156)
    ORDER BY sales_dollar_amount DESC;

                                     QUERY PLAN
--------------------------------------------------------------------------------
 ------------------------------
 QUERY PLAN DESCRIPTION:
 The execution of this query involves non-participating nodes.
 Crunch scaling strategy preserves data segmentation
 ------------------------------
 . . .

在大多数情况下,优化器选择最佳策略来在订阅同一分片的节点之间拆分数据。但是,您可能偶尔发现某些查询性能不佳。在这些情况下,查询可以嵌入 ECSMODE 提示来指定使用哪种策略甚至禁用 ECS。

为单个查询设置 ECS 策略

您可以在查询中使用 ECSMODE 提示来强制优化器使用特定的 ECS 策略(或完全禁用 ECS)。ECSMODE 提示采用以下实参之一:

  • AUTO:优化器选择要使用的策略,仅当在会话级别设置 ECS 模式时才有用(请参阅为会话或数据库设置 ECS 策略)。

  • IO_OPTIMIZED:使用 I/O 优化策略。

  • COMPUTE_OPTIMIZED:使用计算优化策略。

  • NONE:对此查询禁用 ECS。只有参与节点才会涉及查询执行;协作节点不会涉及。

以下示例显示了简单的单表查询(被强制使用计算优化策略)的查询计划:

=> EXPLAIN SELECT /*+ECSMode(COMPUTE_OPTIMIZED)*/ employee_last_name,
             employee_first_name,employee_age
             FROM employee_dimension
             ORDER BY employee_age DESC;

                                   QUERY PLAN
--------------------------------------------------------------------------------
 ------------------------------
 QUERY PLAN DESCRIPTION:
 The execution of this query involves non-participating nodes.
 Crunch scaling strategy preserves data segmentation
 ------------------------------
. . .

此示例在三分片数据库的六节点群集中禁用 ECS:

=> EXPLAIN SELECT /*+ECSMode(NONE)*/ employee_last_name,
             employee_first_name,employee_age
             FROM employee_dimension
             ORDER BY employee_age DESC;

                                     QUERY PLAN
--------------------------------------------------------------------------------
 ------------------------------
 QUERY PLAN DESCRIPTION:
 ------------------------------

 EXPLAIN SELECT /*+ECSMode(NONE)*/ employee_last_name,
             employee_first_name,employee_age
             FROM employee_dimension
             ORDER BY employee_age DESC;

 Access Path:
 +-SORT [Cost: 243, Rows: 10K] (PATH ID: 1)
 |  Order: employee_dimension.employee_age DESC
 |  Execute on: v_verticadb_node0007, v_verticadb_node0004, v_verticadb_node0005
 | +---> STORAGE ACCESS for employee_dimension [Cost: 71, Rows: 10K] (PATH ID: 2)
 | |      Projection: public.employee_dimension_DBD_8_seg_vmart_b0
 | |      Materialize: employee_dimension.employee_first_name,
 | |      employee_dimension.employee_last_name, employee_dimension.employee_age
 | |      Execute on: v_verticadb_node0007, v_verticadb_node0004,
 | |          v_verticadb_node0005
 . . .

注意,该查询计划缺少“此查询涉及非参与节点 (this query involves non-participating nodes)”说明,这表示它不使用 ECS。另外,它仅列出了三个参与节点。这些节点被标记为参与 V_CATALOG.SESSION_SUBSCRIPTIONS 系统表。

为会话或数据库设置 ECS 策略

您可以使用 ECSMode 配置参数来设置当前会话的 ECS 策略。此参数接受与 ECSMODE 提示相同的值,NONE 除外(该值仅对单个查询有效)。

以下示例演示如何使用配置参数强制简单查询使用 COMPUTE_OPTIMIZED 策略。然后,它将参数设置回其默认值 AUTO

=> EXPLAIN SELECT employee_first_name,employee_age
    FROM employee_dimension ORDER BY employee_age DESC;

                                 QUERY PLAN
--------------------------------------------------------------------------------
 ------------------------------
 QUERY PLAN DESCRIPTION:
 The execution of this query involves non-participating nodes.
 Crunch scaling strategy does not preserve data segmentation
 ------------------------------
. . .

=> ALTER SESSION SET ECSMode = 'COMPUTE_OPTIMIZED';
ALTER SESSION
=> EXPLAIN SELECT employee_first_name,employee_age
    FROM employee_dimension ORDER BY employee_age DESC;


                                  QUERY PLAN
--------------------------------------------------------------------------------
 ------------------------------
 QUERY PLAN DESCRIPTION:
 The execution of this query involves non-participating nodes.
 Crunch scaling strategy preserves data segmentation
 ------------------------------
 . . .

=> ALTER SESSION SET ECSMode = 'AUTO';
ALTER SESSION

单个查询提示会覆盖会话级别设置。此示例将会话默认设置为使用 COMPUTE_OPTIMIZED,然后使用值为 AUTO 的 ECSMode 提示还原查询的默认行为:

=> ALTER SESSION SET ECSMode = 'COMPUTE_OPTIMIZED';
ALTER SESSION
=> EXPLAIN SELECT /*+ECSMode(AUTO)*/ employee_first_name,employee_age
   FROM employee_dimension ORDER BY employee_age DESC;


                                  QUERY PLAN
-----------------------------------------------------------------------------
 ------------------------------
 QUERY PLAN DESCRIPTION:
 The execution of this query involves non-participating nodes.
 Crunch scaling strategy does not preserve data segmentation
 ------------------------------

请注意,将 ECSMode 提示设置为 AUTO 会让优化器选择 I/O 优化策略(不保留分段),而不是使用在会话级别设置的计算优化策略。

您还可以使用 ALTER DATABASE 在数据库级别设置 ECS 策略。但是,这样做会覆盖使用 ECS 的所有子群集中所有用户的 Vertica 优化器设置。在数据库级别设置 ECS 策略之前,请验证启用 ECS 的子群集的所有用户运行的大多数查询是否必须覆盖优化器的默认行为。如果不是,则仅针对受益于特定策略的查询,使用会话或查询级别设置来覆盖优化器。