Vertica 性能非常好, 平时基本不会碰到性能问题, 即使碰到, 优化也很容易, 而且效果往往会很好.
======================
优化工具
======================
1. explain 命令.
在一个大 SQL 执行之前, 使用 profile 来查看资源的预期消耗.
veritica 执行计划除了有普通文本格式, 还有 graphviz 格式的文本输出, 可以使用一些 graphviz viewer网站或工具将这些文本以流程图的形式呈现. 比如这个网站 <http://webgraphviz.com/>
2. v_monitor schema 下有很多监控类表, 可以查看内存/执行时间等消耗.
select * from v_monitor.query_requests ;
select * from v_monitor.query_profiles ;
select * from v_monitor.query_metrics ;
select * from v_monitor.memeory_usage ;
select * from v_monitor.cpu_usage ;
select * from v_monitor.io_usage ;
select * from v_monitor.network_usage ;
3. profile 命令
除了 v_monitor.query_requests 给出的时间和内存消耗, 还可以使用 profile 语句获取SQL的执行成本.
该命令结果可以在vsql 命令行工具看到, 或使用 dbeaver的"输出"tab页查看.
======================
优化手法
======================
1. 数据表 (包括临时表) 建表语句需要重点关注数据的分布
具体分布情况的指令有 order by, SEGMENTED by , PARTITION by 从句.
UNSEGMENTED ALL NODES;
SEGMENTED BY HASH(EID) ALL NODES ;
2. 收集统计信息
如果在执行计划中, 看到 "NO STATISTICS" 字眼, 可以试试收集一下统计信息.
SELECT ANALYZE_STATISTICS('');
3. 尽量避免使用 merge 和 update 语句, 使用 Delete+Insert 代替.
4. Delete 虽然性能比 Update 要好, 但大量数据的删除操作, Vertica 也需要很长时间, 尽量使用 truncate 或 分区删除.
5. 对于复杂的子查询语句,使用临时表来代替.
6. 两个表关联避免不同数据类型之间做"隐式转换", 必要时候先使用临时表转成同样数据类型(包括精度), 然后再做join.
根本点是建模时, 同一个domain在不同表中的类型要保持一致.
7. 重建或新建Projection.
如果在执行计划中, 看到 "BROADCAST Join" 字眼, 有可能关联条件写的不合适, 有可能projection建的不合适.
8. 大数据量的操作(Insert/Update/Delete/CTAS 语句), 要善用 /*+ DIRECT */