定義表的儲存模式
如果您需要定義行存表或列存表,可以在建表語句的WITH
參數中指定儲存模式。同時,WITH參數中還可以指定壓縮演算法和等級,詳情如下表。
參數名稱 | 描述 | 取值範圍 |
orientation | 指定表的儲存模式。row 表示行儲存,column 表示列儲存。預設值為row 。 說明 WITH 參數不支援設定行列混存模式。如需設定行列混存,請參見混合儲存表。
| |
compresstype | 指定表的壓縮演算法。 4.3和6.0版本預設值為none ,表示不使用壓縮演算法。 7.0版本預設值為auto ,表示根據資料的特點和系統配置自動選擇最合適的壓縮演算法。 | 4.3 版本支援zlib、rle_type、none、auto。 6.0 版本支援zstd、zlib、rle_type、lz4、none、auto。 7.0版本支援zstd、lz4、none、auto。
|
compresslevel | 指定壓縮層級,較高的值表示更高的壓縮率但有較慢的壓縮速度。預設值為1。 | 1~9。僅支援整數 |
appendonly | 啟用或禁用追加最佳化儲存。預設值為false 。 | |
行存表
預設情況下,AnalyticDB PostgreSQL版建立的是行存表(Heap Table),使用的PostgreSQL堆儲存模型。行存表適合資料更新較頻繁的情境,或者採用INSERT方式的即時寫入的情境,同時當行存表建有B-Tree索引時,具備更好的點查詢資料檢索效能。
樣本
列存表
列存表(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_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、auto。
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);