雲原生資料倉儲AnalyticDB PostgreSQL版支援行存、列存和行列混合儲存三種儲存模式。您可以根據使用情境,在建表時選行存表(適合資料更新較頻繁或採用INSERT方式的即時寫入的情境)或列存表(適合少量列的資料查詢、聚集等資料倉儲應用情境)。
定義表的儲存模式
如果您需要定義行存表或列存表,可以在建表語句的WITH參數中指定儲存模式。同時,WITH參數中還可以指定壓縮演算法和等級,詳情如下表。
參數名稱 | 描述 | 取值範圍 |
orientation | 指定表的儲存模式。 說明
|
|
compresstype | 指定表的壓縮演算法。 4.3和6.0版本預設值為 7.0版本預設值為 |
|
compresslevel | 指定壓縮層級,較高的值表示更高的壓縮率但有較慢的壓縮速度。預設值為1。 | 1~9。僅支援整數 |
appendonly | 啟用或禁用追加最佳化儲存。預設值為 |
|
注意事項
核心版本為7.1.1.4及以上的AnalyticDB for PostgreSQL7.0版執行個體預設儲存引擎為Beam。存量執行個體升級版本不改變預設儲存引擎,您可以在建立表時指定儲存引擎為beam,或變更已存在的表的儲存引擎為beam。
AnalyticDB for PostgreSQL6.0版執行個體,以及核心版本為7.1.1.4以下的7.0版執行個體,預設儲存引擎為Heap,使用PostgreSQL堆儲存模型。
行存表
行存表適合資料更新較頻繁的情境,或者採用INSERT方式的即時寫入的情境,同時當行存表建有B-Tree索引時,具備更好的點查詢資料檢索效能。
樣本
下述語句建立了一個預設堆儲存類型的行存表。
CREATE TABLE foo (a int, b text) DISTRIBUTED BY (a);說明當採用Data Transmission Service寫入 AnalyticDB for PostgreSQL資料時,AnalyticDB for PostgreSQL的目標表應設計為行存表,而不要採用列存表。DTS為準即時資料同步方式,除INSERT外,即支援UPDATE和DELETE等較多更新操作的同步。
您可以指定
orientation參數建立行存表(ao_row)。CREATE TABLE bar (a int, b text) WITH (appendonly=true, orientation=row) DISTRIBUTED BY (a);
列存表
列存表(Column-Oriented Table)的按列儲存格式,資料訪問只會讀取涉及的列,適合少量列的資料查詢、聚集等資料倉儲應用情境,在此類情境中,列存表能夠提供更高效的I/O。但列存表不適合頻繁的更新操作或者大批量的INSERT寫入情境,這時其效率較低。列存表的資料寫入建議採用COPY等批量載入方式。列存表可以提供平均 3-5倍的較高資料壓縮率。
樣本
列存表必須是追加最佳化表。例如,要建立一個列存表,必須指定為appendonly=true。
CREATE TABLE bar (a int, b text)
WITH (appendonly=true, orientation=column)
DISTRIBUTED BY (a);混合儲存表
僅AnalyticDB for PostgreSQL7.0版執行個體支援混合儲存表。
分區表和非分區表均支援行列混合儲存。
非分區表
將非分區表的儲存引擎設定為beam即可實現行列混存。
Beam的儲存分為行存Delta和PAX結構的列存Base兩個部分。在資料寫入時,會根據資料寫入方式,自動選擇合適的儲存模式。當您使用INSERT INTO VALUES等流式即時方式寫入資料時,會寫入行存Delta部分,以達到與行存Heap表相當的即時寫入效能。當您使用COPY或INSERT INTO SELECT等批處理方式寫入資料時,則會直接寫入到列存Base部分,以達到更高的吞吐,獲得更高的寫入效能。
建立表時指定儲存引擎為beam
CREATE TABLE testtable (a int) USING beam;變更已存在的表的儲存引擎為beam
ALTER TABLE testtable SET ACCESS METHOD beam;分區表
以如下分區表am_partitioned為例,為您介紹如何設定分區表的行列混存的方法。
CREATE TABLE am_partitioned(x INT, y INT)
PARTITION BY HASH (x) USING heap;建立分區時指定分區的儲存模式
建立後,am_partitioned_1分區為ao_column列存。
CREATE TABLE am_partitioned_1 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 0) USING ao_column;建立後,am_partitioned_2分區的儲存模式為行列混存。
CREATE TABLE amm_partitioned_2 PARTITION OF amm_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 1) USING beam;
變更已存在分區的儲存模式
變更am_partitioned_1儲存模式為ao_row行存。
ALTER TABLE am_partitioned_1 SET ACCESS METHOD ao_row;壓縮
壓縮主要用於列存表或者追加寫(appendonly=true)的行存表,有以下兩種類型的壓縮可用。
應用於整個表的表級壓縮。
應用到指定列的列級壓縮。使用者可以為不同的列應用不同的列級壓縮演算法。
目前AnalyticDB PostgreSQL版支援的壓縮演算法如下:
4.3 版本支援zlib、rle_type、none、auto。
6.0 版本支援zstd、zlib、rle_type、lz4、none。
7.0版本支援zstd、lz4、none、auto。
您也可以指定QuickLZ壓縮演算法,但內部會使用zlib演算法替換,另外rle_type演算法只適用於列存表。
樣本
建立一個列存表。
CREATE TABLE am_testtable(x INT, y INT)
WITH (orientation=column);建立一個使用zlib壓縮且壓縮層級為5的列存表。
CREATE TABLE foo (a int, b text)
WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=5);建立一個使用zstd壓縮且壓縮層級為9的列存表。
CREATE TABLE foo (a int, b text)
WITH (appendonly=true, orientation=column, compresstype=zstd, compresslevel=9);