实时分析

可以通过查询系统表 执行_引擎_配置文件 来监控长时间运行的查询的执行。此表包含可用于内部操作和用户语句的分析计数器。可以使用 Linux watch 命令频繁地查询此表。

对实时分析数据的查询需要事务 ID。如果事务执行多个语句,则查询还需要语句 ID 来标识所需的语句。如果分析单个查询,则查询会返回语句的事务和语句 ID。还可以从 SYSTEM_SESSIONS 系统表中获取事务和语句 ID。

分析计数器

执行_引擎_配置文件 系统表包含可用于内部操作和用户语句的分析计数器。实时分析计数器可用于所有语句的执行,包括 合并恢复刷新等内部操作。除非在特定 SQL 语句中使用 PROFILE 关键字显式地启用分析,或者普遍地为数据库和/或当前会话启用分析,否则在语句完成后分析计数器将不可用。

有用的计数器包括:

  • 执行时间 (µs)

  • 生成的行数

  • 合并阶段总数

  • 已完成的合并阶段数

  • 当前临时文件大小(字节数)

可以通过查询 执行_引擎_配置文件 来查看所有可用的计数器:

=> SELECT DISTINCT(counter_name) FROM EXECUTION_ENGINE_PROFILES;

若要监控分析计数器,可使用检索到的事务 ID (a000000000027) 运行类似如下所示的命令:

=> SELECT * FROM execution_engine_profiles
   WHERE TO_HEX(transaction_id)='a000000000027'
   AND counter_name = 'execution time (us)'
   ORDER BY node_name, counter_value DESC;

以下示例将查找每个节点上执行时间最长的运算符:

=> SELECT node_name, operator_name, counter_value execution_time_us FROM V_MONITOR.EXECUTION_ENGINE_PROFILES WHERE counter_name='execution time (us)' LIMIT 1 OVER(PARTITION BY node_name ORDER BY counter_value DESC);
    node_name     | operator_name | execution_time_us
------------------+---------------+-------------------
 v_vmart_node0001 | Join          |            131906
 v_vmart_node0002 | Join          |            227778
 v_vmart_node0003 | NetworkSend   |            524080
(3 rows)

Linux watch 命令

可以使用 Linux watch 命令经常地监控长时间运行的查询。常见使用案例包括:

  • 观察每个 Vertica 群集节点上查询计划内的运算符执行情况。

  • 监控可能在各群集节点之间不平衡的工作负载,例如,一些节点处于空闲状态,而其他节点却处于活动状态。这种不平衡情况可能是由数据偏离或硬件问题所导致。

在以下示例中,watch 将查询每个节点上执行时间最长的运算符。该命令指定每秒重新执行一次查询:

watch -n 1 -d "vsql VMart -c\"SELECT node_name, operator_name, counter_value execution_time_us
FROM v_monitor.execution_engine_profiles WHERE counter_name='execution time (us)'
LIMIT 1 OVER(PARTITION BY node_name ORDER BY counter_value DESC);

Every 1.0s: vsql VMart -c"SELECT node_name, operator_name, counter_value execution_time_us FROM v_monitor.execu...  Thu Jan 21 15:00:44 2016

    node_name     | operator_name | execution_time_us
------------------+---------------+-------------------
 v_vmart_node0001 | Root          |            110266
 v_vmart_node0002 | UnionAll      |             38932
 v_vmart_node0003 | Scan          |             22058
(3 rows)