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 */