本文介紹PolarDB MySQL版列存表在單機執行階段的加速能力、效能表現和觀測方法。預設情況下,列存查詢會優先由最佳化器選擇是否走MPP計劃,當查詢被調度到某個執行節點後,節點內部仍然依賴單機列執行最佳化來降低時延。本文重點介紹這部分節點內執行最佳化能力。
背景與價值
隨著分析型查詢資料量持續增長,單機執行容易在以下幾個方面成為瓶頸:
讀取了查詢不需要的列
掃描了最終會被過濾掉的資料區塊
相同資料頁重複讀取、重複解碼
單機緩衝無法覆蓋熱點資料
大表彙總、Join、排序對CPU和記憶體頻寬要求高
全列存表的列執行加速能力,目標就是把“唯讀必要列、只處理必要資料、盡量複用已解碼結果”落實到執行鏈路中,從而降低查詢時延並提升吞吐。
從執行鏈路看,這部分最佳化主要體現在:
按查詢所需列讀取資料,減少無效列掃描。
將可下推謂詞盡量下推到底層儲存,提前做Stripe粒度或資料區塊裁剪。
通過可見度視圖快速過濾檔案減少無效行進入後續彙總、排序和運算式計算。
複用OSS頁緩衝與中繼資料快取,降低重複讀取和重複解碼成本。
按批次向執行層輸送資料,發揮向量化批處理優勢。
與多機並行能力的關係及判斷方法
本文聚焦單機執行加速。關於列存表多機並存執行能力、適用情境和分區設計,請參見多機分析。
如果需要區分某條SQL最終是否走了MPP計劃,可以查看執行計畫中是否存在Exchange運算元。
EXPLAIN SELECT /*+ SET_VAR(imci_plan_use_mpp=forced) */ COUNT(*) FROM nation;若執行計畫中出現Exchange運算元,說明該SQL可以使用列存多機並行能力。若實際執行計畫中出現Exchange運算元,則說明該SQL最終按MPP計劃執行。反之,如果執行計畫中沒有Exchange,則表示該SQL按單機計劃執行。
效能測試結果
以下是一個規格為32核256 GB,在TPC-H 1 100 GB的全列存表單機熱態測試結果:
本文的TPC-H的實現基於TPC-H的基準測試,並不能與發行的TPC-H基準測試結果相比較,本文中的測試並不完全符合TPC-H的所有要求。
Query | Time(s) |
Q1 | 1.175 |
Q2 | 0.178 |
Q3 | 0.577 |
Q4 | 0.433 |
Q5 | 0.522 |
Q6 | 0.366 |
Q7 | 0.633 |
Q8 | 0.528 |
Q9 | 2.817 |
Q10 | 0.935 |
Q11 | 0.218 |
Q12 | 0.535 |
Q13 | 1.255 |
Q14 | 0.442 |
Q15 | 0.889 |
Q16 | 0.553 |
Q17 | 0.738 |
Q18 | 2.381 |
Q19 | 0.759 |
Q20 | 0.453 |
Q21 | 1.308 |
Q22 | 0.299 |
TOTAL | 17.994 |