1.with as 的cte優化,一般開發中習慣使用with as方便閱讀,但如果子查詢結果在下游被多次引用,可以使用一定的參數優化手段減少表掃描次數
默認set hive.optimize.cte.materialize.threshold=-1;不自動物化到內存,一般可以設置為
set hive.optimize.cte.materialize.threshold=0;開啟物化到內存操作,但執行時是否開啟與3個條件相關
(1)子查詢復雜程度
(2)下游對子查詢的依賴程度
(3)子查詢結果的數據大小
2.join相關優化,開啟自動翻轉join參數,并重新設定小表的限定值
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=50000000;
join時候產生了數據傾斜可以使用以下兩個參數指定傾斜的字段名稱,設定分桶數量,甚至可以指定傾斜的值
SET hive.skewedjoin.key = id;
SET hive.skewedjoin.num.buckets = 2;
set hive.skewedjoin.value=xxx;
例:
SELECT * FROM table1 JOIN table2 ON table1.id = table2.id;
3.開啟向量化查詢優化,默認不開啟,開啟后可以批量讀取數據,默認大小是1024條,也可以調整為更大
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
4.設定任務優先級
SET mapreduce.job.priority=VERY_HIGH;
5.hive自動優化參數設置,
set hive.stats.autogather=false;
set hive.stats.column.autogather=false;
參數用于控制Hive是否自動收集表和分區的統計信息、是否自動收集列的統計信息。統計信息可以幫助Hive的優化器更好地制定查詢計劃。
false意味著Hive不會自動收集統計信息。你需要手動運行ANALYZE TABLE命令來收集統計信息。
set hive.cbo.enable=false;
當 hive.cbo.enable 設置為 false 時,意味著Hive將不會使用CBO來優化查詢計劃。相反,Hive將使用一種稱為“規則基礎的優化器”(Rule-Based Optimizer,簡稱RBO)的方法來優化查詢。RBO依賴于預定義的規則來重寫或轉換查詢,而不是基于統計信息和成本評估來選擇最佳的執行計劃。
6.reduce相關優化參數
set hive.exec.reducers.max=9999;一般設置為集群中 Worker 節點數量的 2 到 3 倍。
set hive.exec.reducers.bytes.per.reducer=524288000;默認值是256MB
set hive.shuffle.compress=true;啟用shuffle階段的壓縮操作
set hive.map.aggr=true;聚合函數可以應用于 Map 端,減少 Reduce 階段的數據量和計算量,但對于不支持 Map 端聚合的聚合函數需要關閉。
7.時候的一些優化