实时分析
可以通过查询系统表
执行_引擎_配置文件
来监控长时间运行的查询的执行。此表包含可用于内部操作和用户语句的分析计数器。可以使用 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)