AnalyticDB for PG 黑科技解析——列存儲 Meta Scan 性能加速

數據庫技術達摩院 發佈 2019-11-18T10:49:59+00:00

作者:張曉博,2011年畢業於武漢理工大學,曾任職於人大金倉、北大方正信產研究院、百分點等公司,從事資料庫內核開發工作,現在任職於阿里雲資料庫事業部,雲化數據倉庫服務 AnalyticDB for PostgreSQL 資料庫內核開發技術專家。1.

作者:張曉博,2011年畢業於武漢理工大學,曾任職於人大金倉、北大方正信產研究院、百分點等公司,從事資料庫內核開發工作,現在任職於阿里雲資料庫事業部,雲化數據倉庫服務 AnalyticDB for PostgreSQL 資料庫內核開發技術專家。

1. 概述

AnalyticDB for PostgreSQL

AnalyticDB for PostgreSQL 黑科技解析 - 列存儲 Meta Scan 性能加速-阿里雲開發者社區(原HybridDB for PostgreSQL,以下簡稱 ADB PG)是阿里雲上的MPP數據倉庫服務,其內核採用PostgreSQL引擎,基於開源資料庫 Greenplum 改造,並在此基礎上優化分析性能,其中列存儲 metascan 就是提升資料庫查詢性能的一個關鍵特性。

ADB PG支持列存儲格式,具有較高的數據壓縮能力,以及查詢性能,但是當針對有較高過濾率的查詢條件時,依然要做整列數據讀取,或者建 B-Tree 索引,但是索引也有其應用的約束:一是索引無壓縮,數據膨脹較嚴重;二是結果集大的時候,索引代價比 tablescan 高,索引失效等問題。為此 ADB PG 開發了meta scan 功能,具有很好的過濾性能,並且占用的存儲空間也基本可以忽略不計。

ADB PG 的meta scan是對列存表的一種加強,通過收集列存表列的max/min,並配合 block offset機制,可以實現類似於索引的過濾功能。meta信息里保存列的每個block的max、min,offset,max/min用於條件過濾,block offset用於跳過不滿足過濾條件的block,以達到最大程度的減少列存讀取的IO和block解壓的CPU消耗,從而實現查詢性能的提升。TPC-H 1TB 測試整體提升 29%,對於有高過濾率條件的查詢里,可以提升最高5倍性能,比如 TPC-H的 Q06、Q12、Q14、Q15。

2. 列存 metascan的實現

ADB PG的 meta scan 機制類似於開源格式 ORC 或者 PARQUET的元信息,通過meta 信息過濾掉不滿足條件的列存 block,來提升性能。

如上圖所示,ADB PG的每張列存表的數據分為2部分,一部分是表數據,一部分是meta數據,存儲收集的meta信息。在scan的時候,先讀取meta數據,根據min、max過濾掉不需要讀取的block,通過block offset直接讀取滿足條件的block,然後把tuple返回給executor,executor計算後,把結果返回給客戶端。
ADB PG meta存儲格式如下:

meta信息按行分為兩級meta:row group meta和batch group meta

  • row group meta:
    每張表的meta信息有多個row group meta組成,每個row group meta的max/min反應了連續的1w行的meta信息。每個row group meta包含10個row batch meta,如上圖所示,row group的meta為:(min, max) = (1, 4000)。
  • row batch meta:
    每個row batch meta的min/max反應了連續1000個行的meta信息。與row group meta不同的是row batch meta還會記錄覆蓋的第一行所在的block 的block offset。

metascan 在掃描時,會順序讀取row group meta,如果過濾條件滿足當前row group的min/max,則依次遍歷每個row batch meta,如果過濾條件滿足row batch meta的min/max,則會根據block offset,直接定位到文件中的block,否則掃描下一個row batch meta;如果過濾條件不滿足當前的row group,這讀取下一個row group meta,如此循環,直到所有的數據遍歷完全。

為了簡單並且滿足事務特性,meta信息我們採用heap表的形式保存,即meta保存到輔助表中。在創建一個列存表時,同時創建meta表。這樣通過heap表的mvcc以及事務機制,可以自然的實現meta信息與表數據信息的一致性和原子性。

但是該實現方式有一個問題,按這種方式meta必須覆蓋所有的數據,即表上的每一行數據更新,必須更新meta,如果用戶使用單條insert這種方式插入數據,則meta信息會被頻繁更新,這樣既會降低寫入的性能又會降低查詢是scan meta信息的性能。為解決這個問題,我們把meta 表分成兩個primary meta 表和secordary meta 表。隨著insert/update主表,meta信息會同步更新到secordary meta表中,當每個row group meta覆蓋1w個行時,把meta信息從secordary meta表移動到primary meta表中,查詢的時候只查詢primary meta表,這樣就不會因為主表數據的頻繁小量insert/update而導致primary meta膨脹。但是使用這種meta維護方式,scan就需要對primary meta 沒有覆蓋的行做特殊處理,因此meta scan執行邏輯如下:

meta信息的收集是按segfile來劃分的,所以當一個segfile的meta讀取完後,需要把該segfile文件尾部的tuple順序返回給executor。對於primary meta表沒有記錄的segfile,scan完primary meta後,同樣的把這些segfile順序掃描一遍。這樣通過meta scan就可以掃描所有的表數據。

目前的metascan支持如下的數據類型和操作符:

  • 支持的類型:
    Int2/int4/int8

Float4/float8
Time/timetz/timestamp/timestamptz
Varchar/text/bpchar
cash

  • 支持的操作符
    =、<、<=、>、>=

and 邏輯運算符

sortkey 是AnalyticDB for PostgreSQL的另一個特性,可以讓表按指定的列排序,其用來指定在單分區內數據進行排序。把metascan與sortkey結合使用,可以更有效的提高meta scan執行的性能。如果列的值在數據文件中分布比較分散,即使過濾性比較好,meta scan的執行性能可能不好,因為列的值分散在太多的block內,導致只能跳過極少的block。這種情況就可以在表上創建 sortkey,使得在單分區內數據有序排列,讓表按照過濾欄位排序,這樣相同的值都會集中在一起,這些block都是連續的,這樣在執行metascan時,就可以跳過掉大部分block,從而提升掃描的性能。

3. TPC-H測試

TPCH 是一個測試OLAP數據倉庫性能的標準測試集,其主要評價指標是各個查詢的響應時間,即從提交查詢到結果返回所需時間,我們在ADB PG上針對meta scan特性測試對tpch的加速效果,針對tpch 1TB數據HDD硬碟測試,在其中4個表上創建了sortkey:

tpch 測試結果如下:

從測試結果看,對於Q03、Q04、Q06、Q10、Q12、Q14、Q15有非常顯著的性能提升,最多提升了5倍左右。對於tpch 整體性能,按Geomean算後,有22%的提升。
對於剩餘的查詢無明顯的性能提升。分析這些查詢的特性,meta scan對於tpch中有強過濾條件的查詢,性能提升較明顯,但對於全表scan或者join則沒有效果。

4. 既有實例升級 meta scan

對於阿里雲 AnalyticDB for PostgreSQL 的現有實例,如何使用新的meta scan機制? meta scan在實現的時候做了存儲格式的前向兼容,現有實例通過小版本升級後,如果要使用新的meta scan特性,則需要刷新列存表的 meta 信息,可以使用如下的 UDF 來刷新某張表的meta信息:

CREATE OR REPLACE FUNCTION UPGRADE_AOCS_TABLE_META(tname TEXT) RETURNS BOOL AS 

$$


DECLARE
 tcount INT := 0;
BEGIN
 -- CHECK TABLE NAME
 EXECUTE 'SELECT COUNT(1) FROM PG_AOCSMETA WHERE RELID = ''' || tname || '''::REGCLASS' INTO tcount;
 IF tcount IS NOT NULL THEN
 IF tcount > 1 THEN
 RAISE EXCEPTION 'found more than one table of name %', tname;
 ELSEIF tcount = 0 THEN
 RAISE EXCEPTION 'not found target table in pg_aocsmeta, table name:%', tname;
 END IF;
 END IF;

 EXECUTE 'ALTER TABLE ' || tname || ' SET WITH(REORGANIZE=TRUE)';
 RETURN TRUE;
END;


$$

 LANGUAGE PLPGSQL;

select UPGRADE_AOCS_TABLE_META(tname);

AnalyticDB for PostgreSQL 提供了配置參數rds_enable_column_meta_scan用來啟動和關閉metascan,可以使用如下sql啟動或者關閉當前session的metascan:

-- disable metascan
set rds_enable_column_meta_scan = off;
-- enable metascan
set rds_enable_column_meta_scan = on;
-- show metascan is enable?
show rds_enable_column_meta_scan;

如果需要實例級別的開啟或者關閉metascan,可以提工單聯繫我們的技術支持同學修改。

5. 結論

ADB PG 的列存儲 meta scan主要是通過row group 和batch group的max/min 過濾不滿足的block,通過block offset,直接讀取滿足條件的block,這種方式減少掃描是的IO以及block解壓時的CPU消耗,因此在查詢的filter具有一定的過濾性時,meta scan可以有比較明顯的性能提升。
ADB PG 基於開源資料庫PostgreSQL/Greenplum構建,由阿里雲資料庫 OLAP 資料庫團隊維護演進,近期會將全部功能增強開源,回饋開源社區。

關鍵字: