全部產品
Search
文件中心

AnalyticDB:儲存格式

更新時間:Feb 05, 2024

AnalyticDB PostgreSQL支援多種儲存格式。當您建立一個表時,可以選擇表的儲存格式為行存表或者列存表。

行存表

預設情況下,AnalyticDB PostgreSQL建立的是行存表。行存表使用和 PostgreSQL 相同的堆儲存模型(Heap Table),在 OLTP 類型負載下表現最好:這種情境中,資料常由每次一行或幾行的 INSERT 即時插入,且在初始插入後可能被頻繁地修改或刪除。如有較小的表(例如維度資料表),建議選擇行存表。同時,當行存表建有於B-Tree索引時,具備更好的點查詢資料檢索效能。

說明 當採用Data Transmission Service寫入AnalyticDB PostgreSQL時,AnalyticDB PostgreSQL的目標表建議設計為行存表,而不要採用列存表。DTS為準即時資料同步的方式,除INSERT外,同時支援UPDATE和DELETE等較多更新操作的同步。

下述語句建立了一個預設堆儲存類型的行存表 foo。

CREATE TABLE foo (a int, b text)
DISTRIBUTED BY (a);

列存表

列存表(Column-Oriented Table)的按列儲存格式,資料訪問只會讀取涉及的列,適合少量列的資料查詢、聚集等資料倉儲應用情境,在此類情境中,列存表能夠提供更高效的 I/O。但列存表不適合頻繁的更新操作或者大批量的INSERT寫入情境,這時其效率較低。列存表的資料寫入建議採用 COPY 等批量載入方式。列存表可以提供平均 3~5倍的較高資料壓縮率。

列存表必須是追加最佳化表,即要建立一個列存表,必須指定為 "appendonly=true"。

下述語句建立了一個列存表bar。

CREATE TABLE bar (a int, b text)
WITH (appendonly=true, orientation=column)
DISTRIBUTED BY (a);

選擇面向行或者面向列的儲存

行存表和列存表的選擇需根據實際負載而定,在為一個表決定儲存格式時,建議參考下列需求:

  • 對於大部分常用目的或者混合負載,行存表兼顧了靈活性和效能。
  • 如果會頻繁地一條或幾條地插入資料、已有資料會被頻繁的修改和刪除,請考慮行存表。
  • 如果基本是大批量地匯入資料,且已有資料很少被修改和刪除,請考慮列存表。
  • 如果查詢的投影列表或者條件陳述式中常常要求所有或者大部分列,或者表的行尺寸相對較小時,請考慮行存表;相反,如果表具有很多列,且查詢常常訪問這些列的一個小子集時,請考慮列存表。
  • 空間佔用考慮:列存表中的每一列具有相同的資料類型,便於使用臨近資料的相似性來進行壓縮,因此在空間佔用上比行存表更有優勢;另一方面,壓縮做得越好,隨機訪問就會越困難。

修改表的儲存格式

表格儲存體格式(行存或列存)只能在建立表時聲明。要改變儲存模型,必須使用目標的儲存格式建立一個表,將原始表的資料載入到新表中,刪除原始表,並把新表重新命名為原始表的名稱。使用者還必須重新授權原始表上有的許可權。注意這個過程不是原子的,為保證資料完整性,需要業務側保證在修改的過程中對原始表唯讀。

將行存表foo重新載入為列存表。

CREATE TABLE foo_tmp (LIKE foo) WITH (appendonly=true, orientation=column);
INSERT INTO foo_tmp SELECT * FROM sales;
DROP TABLE foo;
ALTER TABLE foo_tmp RENAME TO foo;

GRANT ALL PRIVILEGES ON foo TO user1;
GRANT SELECT ON foo TO user2;