若您经常针对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版实例中使用排序优化功能,请参见排序优化。