提及到数据库开发,SQL的优化是绕不过去的坎,Vertica提供了比较丰富的分析手段,可以帮助开发者观察SQL的执行情况,发生的事件,以及执行过程最慢的路径,可以方便快速的了解如何调整或者优化所开发的SQL。
Vertica执行SQL时采用基于成本的优化器生成执行计划,选择成本最低的执行计划去执行。
开发阶段,可以通过explain verbose语句,查看vertica为SQL所选择的执行计划。
EXPLAIN VERBOSESELECT customer_name, customer_state FROM customer_dimensionWHERE customer_state IN ('MA','NH') AND customer_gender='Male'ORDER BY customer_nameLIMIT 10;
如下图,可以看到针对上述语句,执行计划分为3个部分,绿色部分是第一阶段执行,从底层表中获取数据和过滤数据,第二是对结果进行排序,第三阶段则限制只返回10条记录。

对于管理人员,Vertica提供了SQL执行的视图,便于快速找出需要优化的SQL,以及分析如何优化。
1 找出耗时较长的语句
SELECT(query_duration_us/1000000)::NUMERIC(10,3) duration_sec,session_id,transaction_id,statement_id,node_name,LEFT(query,100)FROM query_profilesWHERE query_start BETWEEN '2020-05-02 15:00:0' AND '2020-05-02 22:00:00'ORDER BY duration_sec DESC;
2 查看语句当时的执行计划,从上述语句中获取SQL执行时的事务号和语句ID,代入下面语句:
Select * from QUERY_PLAN_PROFILESWHERE transaction_id = 45035996273706380and statement_id=1;
3 除了查看执行计划是否合理或可优化,也需要分析语句执行期间的事件情况
SELECT node_name, event_type, event_description,operator_name, path_id, event_details, suggested_actionFROM query_eventsWHERE transaction_id = 45035996273706380AND statement_id = 1ORDER BY node_name;
4 识别语句执行过程中的最慢执行路径,有助于针对性的优化。这里的时间单位是微秒。
SELECToperator_name,path_id,SUM(counter_value)FROM execution_engine_profilesWHERE transaction_id = 45035996273706380AND statement_id = 1AND counter_name ILIKE 'execution%'GROUP BY operator_name, path_idORDER BY 3 DESC LIMIT 20;
上述的过程,与Oracle数据库的分析过程基本一致,如果是从Oracle数据库转过来的开发人员,上手分析应该还是比较快捷的。
文章转载自南山笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




