CV執行過程
- 計算視圖激活時,生成Stored Model
- SELECT查詢時:
- 首先將Stored Model實例化為runtime Model?
- 計算引擎執行優化,將runtime Model轉換為Optimized Runtime Model
- Optimized Runtime Model通過SQL Optimizer進行優化
計算引擎優化
特性 | 說明 |
---|---|
Join cardinality 指定Join的連接基數 | 有可能實現Join剪枝,提高性能并減少臨時內存消耗 |
Optimized join columns 優化連接列 | 允許優化連接列,減少Join節點后需處理的數據量 |
Dynamic joins 動態連接 | 動態減少Join字段,減少Join節點處理數據量 |
Union Node Pruning Union剪枝 | 允許Union數據源剪枝,提升性能 |
column pruning 列剪枝 | 計算視圖固有特性,引擎會在前期移除任何對結果不需要的字段 |
計算引擎優化
設置Join基數
出現Join剪枝前提:
- SELECT字段不在要剪掉的表中
- Join類型是外連接、引用連接、文本連接
- 要剪掉的表的Joina基數是1
優化連接字段
連接字段前枝前提:
- The join field is not requested by the query.
- Only fields from one of the join partners are requested by the query.
- The join is either an outer join, referential join, or text join.
- The cardinality to the join partner from which none of the fields are requested is set to 1.
設置動態連接
- 執行時Join時,連接列不是視圖定義時的所有連接列,而是僅需要的連接列(連接條件是動態的)
- 動態連接與靜態連接執行的結果可能不一致,在使用前需明確其影響
- 設置動態連接SELECT查詢時,必須要用到至少一個連接字段,否則會報執行時錯誤
Union節點剪枝
- Constant mapping
- Pruning configuration table
使用Hints
在語句層面配置
SELECT * FROM CV1 WITH HINT(NO_CALC_VIEW_UNFOLDING);
在CV層面配置
名稱 | 值 | 使用場景 |
query_level_sql_hints? | 逗號分隔的hint | 僅對unfolding的視圖有效,若未展開,這些hint不起作用 |
qo_pop_hints? | 逗號分隔的hint | 僅對未展開且設置了在SQL引擎中執行的視圖才有效,hint僅對SQL引擎能優化的部分生效 |
no_calc_view_unfolding? | 1 | 用于阻止視圖展開 |
sql_opt_hints | CALC_VIEW_UNFOLDING | 在全局禁止視圖展開的使用 |
說明
- Hint名稱必須小寫
- hints必須在最上層計算視圖上設置
- 通過視圖M_CE_CALCSCENARIO_HINTS監控CV上的HINT設置
Execute in SQL Engine
無特殊配置情況下
配置Execute in SQL Engine后
怎么確定Query是否展開
通過?Explain Plan功能,如果計劃內是具體的實體表,則視圖是展開的
若計劃內是計算視圖,則沒有展開
Static Cache
使用靜態緩存前提:
- 視圖配置Enable Cache選項
- 視圖可以展開
- 視圖沒有granularity-tracking calculations
- 查詢要求使用static cache,即HINT(RESULT_CACHE)
靜態緩存監控:M_RESULT_CACHE、RESULT_CACHE、RESULT_CACHE_COLUMNS
視圖檢查監控
CHECK_ANALYTICAL_MODEL ('<action>', '<schema_name>', '<object_name>',
<return_object>)
性能相關建議
建議:
- 設置Join基數
- 優化Join連接字段
- scale-out場景Join字段是分區字段
不建議:
- Join字段是計算列
- 在計算列上進行數據過濾
- Measures in join conditions
- Measures in filter expressions?
- Data type conversion in filters