Beam使用
本文介紹如何使用存儲(chǔ)引擎Beam。
注意事項(xiàng)
僅存儲(chǔ)彈性模式v7.0.x版本支持Beam存儲(chǔ)引擎。
Beam存儲(chǔ)引擎在存儲(chǔ)彈性模式v7.0.6.2版本中結(jié)束公測(cè)正式上線,該版本修復(fù)了公測(cè)中的問(wèn)題,建議您盡快升級(jí)到v7.0.6.2及以上版本。
創(chuàng)建Beam表
使用Beam引擎創(chuàng)建表,需要在SQL語(yǔ)句中指定USING beam
配置項(xiàng)。例如,創(chuàng)建一個(gè)名為test
的Beam表。
CREATE TABLE test(a INT, b INT)
USING beam
DISTRIBUTED BY (a);
默認(rèn)情況下,Beam表會(huì)對(duì)所有的列使用LZ4 9級(jí)壓縮。
指定排序鍵
您可以通過(guò)指定排序鍵的方式來(lái)指定數(shù)據(jù)的物理聚集方式。同時(shí)Beam會(huì)對(duì)指定的排序鍵和主鍵列收集最大(Max)或最小(Min)信息,從而加速包含排序鍵過(guò)濾條件的查詢。 例如,SQL語(yǔ)句中包含sale_date='20230715'
的條件,則數(shù)據(jù)基于sale_date
列排序會(huì)獲得額外的性能收益。
您可以在ORDER BY
子句中指定一個(gè)或多個(gè)排序鍵。Beam表會(huì)在后臺(tái)自動(dòng)對(duì)數(shù)據(jù)基于排序鍵進(jìn)行重排序優(yōu)化。
示例
創(chuàng)建帶排序建的Beam表。
CREATE TABLE beam_example (
id integer,
name text,
ftime timestamp
)
USING beam
DISTRIBUTED BY (id)
ORDER BY(id);
向Beam表中寫入10000000行數(shù)據(jù),并帶排序鍵過(guò)濾條件查詢。
INSERT INTO beam_example
SELECT r, md5((r*random())::text), now() + interval '1 seconds' *(r*random())::int
FROM generate_series(1,10000000)r;
SELECT * FROM beam_example WHERE id = 100000;
指定壓縮算法
Beam支持多種壓縮算法,您可以根據(jù)實(shí)際業(yè)務(wù)需要選擇不同的壓縮算法。Beam支持ZSTD、LZ4、AUTO和GDICT壓縮算法。默認(rèn)使用LZ4 1級(jí)壓縮,以提供在大部分場(chǎng)景下更優(yōu)的解壓性能。
ZSTD
如果您期望獲得更高的壓縮比,可以使用ZSTD壓縮算法,但其壓縮和解壓性能較弱于LZ4。
LZ4
擁有極高的壓縮和解壓性能,但是會(huì)損失一部分壓縮率。
AUTO
AUTO是Beam自研的自適應(yīng)的壓縮算法。對(duì)于數(shù)值列,根據(jù)數(shù)據(jù)的Layout提供相對(duì)于通用壓縮算法更高的壓縮比和更高的壓縮、解壓效率。對(duì)于其他類型,則使用LZ4通用壓縮算法進(jìn)行壓縮。
GDICT
GDICT是Beam自研的全局字典編碼。GDICT在低基數(shù)列(小于256個(gè)值),可以提供極致的壓縮比和解壓性能。同時(shí)支持過(guò)濾條件下推,在特定的場(chǎng)景下,相對(duì)于通用壓縮算法可以獲得最高100X的掃描性能提升。
示例
創(chuàng)建一個(gè)壓縮算法為ZSTD 9級(jí)壓縮的Beam表。
CREATE TABLE beam_example (
id integer,
name text,
ftime timestamp
) USING beam
WITH(compresstype='zstd', compresslevel=9) ;
Auto Optimize
當(dāng)您的Beam表有多次寫入、更新或刪除操作時(shí),隨著時(shí)間的推移,表中會(huì)存在大量的過(guò)期數(shù)據(jù),從而導(dǎo)致掃描性能下降。Auto Optimize是后臺(tái)的數(shù)據(jù)優(yōu)化進(jìn)程,會(huì)自動(dòng)對(duì)您的Beam表進(jìn)行過(guò)期數(shù)據(jù)回收,小文件合并和數(shù)據(jù)按照排序鍵聚集操作,從而保障查詢性能。一般情況下,該操作都會(huì)由后臺(tái)進(jìn)程自動(dòng)完成,您也可以通過(guò)OPTIMIZE beam_example;
命令手動(dòng)觸發(fā)Optimize。