若您經常針對Beam表的某幾列進行范圍查詢或等值篩選時,您可以使用Beam排序鍵(組合排序鍵或多維排序鍵),獲得更優的查詢性能。
Beam支持在創建表時指定一個或者多個排序鍵,系統會按照排序鍵持續對寫入數據進行排序。當數據有序后,Beam在對表進行掃描時可以根據數據塊的最大和最小值跳過不滿足過濾條件的數據塊,從而極大地減少I/O開銷。此外,定義排序鍵通常也能使數據獲得更好的壓縮比。目前Beam支持兩種排序鍵類型:組合排序鍵和多維排序鍵。
注意事項
僅v7.0.1.x及以上版本的AnalyticDB PostgreSQL 7.0版實例支持Beam排序優化功能。查看實例的內核版本,請參見查看內核小版本。
組合排序
定義組合排序鍵
組合排序鍵會按照定義排序鍵的順序,優先按照第一個排序鍵完全有序,再依次按照剩余的排序鍵排序。組合排序鍵對包含排序鍵前綴的查詢過濾條件有很好的數據過濾效果。
創建帶有組合排序鍵的Beam表,示例如下。
CREATE TABLE beam_example (
id integer,
name text,
ftime timestamp
)
USING beam
DISTRIBUTED BY (id)
ORDER BY(id);
維護組合排序鍵
創建組合排序鍵后,您新寫入的數據不會立即按照排序鍵的順序有序,而是后臺進程會依照數據量和文件數,自動地幫您生成最好的排序效果。如果您想讓表中的數據立即完全有序,可以執行Optimize命令使您寫入的數據完全有序。
使beam_example
表中的數據立即完全有序,示例如下。
OPTIMIZE beam_example;
執行Optimize命令時會阻塞DDL變更,命令執行完成后,DDL會自動繼續執行。
多維排序
注意事項
僅v7.0.4.0及以上版本的AnalyticDB PostgreSQL 7.0版實例支持Beam多維排序。查看實例的內核版本,請參見查看內核小版本。
目前一個表僅支持設置2~8列的多維排序鍵,無法創建超出限制的多維排序Beam表。
不建議將遞增的數據列(例如日期、時間戳)作為多維排序鍵的一部分。
定義多維排序鍵
多維排序鍵為排序鍵中的每個列賦予相同的權重進行排序,盡量保持每列數據的維度具有鄰近性。多維排序鍵對包含任意排序鍵列的查詢都有一定數據過濾效果。
創建帶有多維排序鍵的Beam表,示例如下。
CREATE TABLE beam_example_interleaved (
id integer,
name text,
ftime timestamp,
region varchar,
age integer
)
USING beam
DISTRIBUTED BY (id)
ZORDER BY(name, region, age);
維護多維排序鍵
創建多維排序鍵后,您新寫入的數據不會立即進行多維排序,而是后臺進程會依照數據量和文件數,自動地幫您生成最好的排序效果。然而,隨著新數據的寫入,多維排序可能會因為數據范圍的變化逐漸產生傾斜現象,這時需要您手動對表進行重新排序。
以按照name
和region
兩列多維排序的beam_example_interleaved
表為例,查看多維排序列當前傾斜情況的語句如下。
SELECT * FROM adbpg_toolkit.pg_get_interleaved_skew('beam_example_interleaved'::regclass)
relid | colname | skew | suggestion
-------+----------+------+---------------
17139 | name | 0.46 |
17139 | region | 0.54 | NEED OPTIMIZE
17139 | OVER ALL | 0.54 | NEED OPTIMIZE
(3 rows)
查看當前數據庫所有多維排序表每列的傾斜情況的語句如下。
SELECT * FROM adbpg_toolkit.pg_stat_interleaved_skew;
relid | relname | colname | skew | suggestion
-------+--------------------------+----------+------+---------------
17139 | beam_example_interleaved | name | 0.46 |
17139 | beam_example_interleaved | region | 0.54 | NEED OPTIMIZE
17139 | beam_example_interleaved | OVER ALL | 0.54 | NEED OPTIMIZE
(3 rows)
返回結果各列信息如下。
skew
:多維排序鍵傾斜數據量的比例。suggestion
:當前對該多維排序鍵建議執行的操作。當出現NEED OPTIMIZE
時,表示該列需要重新做排序。colname
列中OVER ALL
表示對各列排序鍵的綜合傾斜情況。如果您只對多維排序鍵某幾列的傾斜情況關注,可以只根據該列的傾斜情況觸發全表的排序。
如果您想讓表中的數據立即完全有序,可以運行Optimize命令使您寫入的數據完全有序。
使beam_example_interleaved
表中的數據立即完全有序,示例如下。
OPTIMIZE beam_example_interleaved;
執行Optimize命令時會阻塞DDL變更,命令執行完成后,DDL會自動繼續執行。
添加或修改排序鍵
在新建表后,您還可以添加排序鍵或者修改排序鍵,或刪除已有的排序鍵。
注意事項
添加或修改排序鍵期間,該表會被鎖住無法進行讀寫操作。
修改排序鍵會導致全表的數據重寫,大數據量的表執行時間較長,請謹慎操作。
修改組合排序鍵后會立即對數據進行排序;修改多維排序鍵則不會立即對數據進行排序,因此帶有多維排序鍵的表修改排序鍵后,建議對表手動執行Optimize命令。
示例
添加或修改組合排序鍵。
ALTER TABLE beam_example SET ORDER BY(id, name);
添加或修改多維排序鍵。
ALTER TABLE beam_example_interleaved SET ZORDER BY(name, region);
刪除排序鍵。
ALTER TABLE beam_example SET ORDER NONE;
如何選擇排序鍵
使用Beam存儲引擎選擇排序鍵的建議:
如果您經常對某列或某幾列進行范圍查詢或等值篩選,則指定該列作為排序鍵。
如果經常對多列進行范圍查詢或等值篩選,多列的查詢頻率和篩選率大致相同,且其中不包含自增列,考慮使用多維排序鍵;如果對某列的查詢頻率和篩選率較高,則優先考慮使用組合排序鍵。
設置組合排序鍵時,如果使用頻率相等,優先將低基數列放在組合排序鍵的前面。
設置多維排序鍵時,排序鍵列的基數不宜過高,同時數據量越大時,多維排序的效果越明顯。
Beam組合排序鍵和多維排序鍵查詢效果對比
以下是對數據量1 TB的SSB Benchmark中lineorder_flat
Beam表分別建立的組合排序鍵和多維排序鍵后,對比不同場景篩選條件下的查詢效果,其中排序鍵為LO_ORDERDATE
和P_BRAND
。
篩選條件 | 組合排序鍵(s) | 多維排序鍵(s) |
首列點查 | 0.297 | 18.329 |
首列1% | 1.268 | 19.224 |
首列10% | 16.83 | 38.30 |
首列50% | 65.62 | 76.99 |
首列點查 + 非首列點查 | 0.288 | 5.29 |
首列1% + 非首列1% | 7.36 | 6.46 |
首列10% + 非首列10% | 91.73 | 26.70 |
首列50% + 非首列50% | 376.22 | 87.82 |
首列50% + 非首列點查 | 71.83 | 19.16 |
首列10%% + 非首列1% | 82.50 | 18.95 |
首列1% + 非首列10% | 7.98 | 6.43 |
首列點查 + 非首列50% | 0.50 | 31.48 |
非首列點查 | 87.04 | 19.67 |
非首列1% | 515.08 | 78.90 |
非首列10% | 567.85 | 131.39 |
非首列50% | 588.86 | 134.36 |
該結果僅比較兩類排序鍵的相對性能差異,不代表AnalyticDB PostgreSQL版在該數據集下的最佳性能。
從上面的查詢結果能夠看出,對于僅包含排序鍵首列的查詢以及對排序鍵首列篩選率較高的場景,使用組合排序鍵較好。如果是對排序鍵非首列有查詢或者包含多列排序鍵的查詢,多維排序鍵的效果更佳。
相關文檔
Beam排序優化僅適用于AnalyticDB PostgreSQL 7.0版實例,如果您需要在AnalyticDB PostgreSQL 6.0版實例中使用排序優化功能,請參見排序優化。