0 Explain 查看執行計划
在 clickhouse 20.6 版本之前要查看 SQL 語句的執行計划需要設置日志級別為 trace 才能可以看到,並且只能真正執行 sql,在執行日志里面查看。在 20.6 版本引入了原生的執行計划的語法。在 20.6.3 版本成為正式版本的功能。
本文檔基於目前較新穩定版 21.7.3.14。
1 基本語法
EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]
PLAN:用於查看執行計划,默認值。
◼header 打印計划中各個步驟的 head 說明,默認關閉,默認值 0;
◼description 打印計划中各個步驟的描述,默認開啟,默認值 1;
◼actions 打印計划中各個步驟的詳細信息,默認關閉,默認值 0。
➢AST :用於查看語法樹;
➢SYNTAX:用於優化語法;
➢PIPELINE:用於查看 PIPELINE 計划。
◼header 打印計划中各個步驟的 head 說明,默認關閉;
◼graph 用 DOT 圖形語言描述管道圖,默認關閉,需要查看相關的圖形需要配合graphviz 查看;
◼actions 如果開啟了 graph,緊湊打印打,默認開啟。
注:PLAN 和 PIPELINE 還可以進行額外的顯示設置,如上參數所示。
2 案例實操
2.1 新版本使用 EXPLAIN
可以再安裝一個 20.6 以上版本,或者直接在官網的在線 demo,選擇高版本進行測試。
官網在線測試鏈接:https://play.clickhouse.tech/?file=welcome
1)查看 PLAIN
簡單查詢
explain plan select arrayJoin([1,2,3,null,null]);
復雜 SQL 的執行計划
explain select database,table,count(1) cnt from system.parts where database in ('datasets','system') group by database,table order by database,cnt desc limit 2 by database;
打開全部的參數的執行計划
EXPLAIN header=1, actions=1,description=1 SELECT number from system.numbers limit 10;
2)AST 語法樹
EXPLAIN AST SELECT number from system.numbers limit 10;
3)SYNTAX 語法優化
//先做一次查詢 SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') FROM numbers(10); //查看語法優化 EXPLAIN SYNTAX SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') FROM numbers(10); //開啟三元運算符優化 SET optimize_if_chain_to_multiif = 1; //再次查看語法優化 EXPLAIN SYNTAX SELECT number = 1 ? 'hello' : (number = 2 ? 'world' : 'atguigu') FROM numbers(10); //返回優化后的語句 SELECT multiIf(number = 1, \'hello\', number = 2, \'world\', \'xyz\') FROM numbers(10)
4)查看 PIPELINE
EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 20; //打開其他參數
EXPLAIN PIPELINE header=1,graph=1 SELECT sum(number) FROM numbers_mt(10000) GROUP BY number%20;
2.2 老版本查看執行計划
clickhouse-client -h 主機名 --send_logs_level=trace <<< "sql" > /dev/null
其中,send_logs_level 參數指定日志等級為 trace,<<<將 SQL 語句重定向至 clickhouse-client 進行查詢,> /dev/null 將查詢結果重定向到空設備吞掉,以便觀察日志。
注意:
1、通過將 ClickHouse 的服務日志,設置到 DEBUG 或者 TRACE 級別,才可以變相實現EXPLAIN 查詢的作用。
2、需要真正的執行 SQL 查詢,CH 才能打印計划日志,所以如果表的數據量很大,最好借助 LIMIT 子句,減小查詢返回的數據量。