排序加速计算
更新时间:
复制为 MD 格式
本文为您介绍云原生数据仓库AnalyticDB PostgreSQL版如何通过底层的数据顺序加速查询速度。
当您执行SORT <tablename>后,系统会对表数据进行排序,当数据完成排序后,AnalyticDB PostgreSQL版即可利用数据的物理顺序,将SORT算子下推到存储层进行计算加速。如果您的SQL可以利用底层的数据顺序,则会从中获得加速收益,该特性可以基于SORT KEY加速SORT、AGG、JOIN算子。
说明
- 排序加速计算功能需要数据完全有序,当您写入数据后需要重新执行
SORT <tablename>对数据进行排序。 - 排序加速计算功能默认开启。
示例
以下示例将在测试表far中执行同样的查询语句,对比排序加速前与排序加速后查询时间的差距。
- 创建测试表far,语句如下:
CREATE TABLE far(a int, b int) WITH (APPENDONLY=TRUE, COMPRESSTYPE=ZSTD, COMPRESSLEVEL=5) DISTRIBUTED BY (a) --分布键 ORDER BY (a); --排序键 - 写入1000000行数据,语句如下:
INSERT INTO far VALUES(generate_series(0, 1000000), 1); - 数据导入完成后,对数据进行排序,语句如下:
SORT far;
查询性能对比如下:
说明 当前示例的查询时间仅供参考。查询时间受到数据量、计算资源、网络状况等多个因素影响,请以实际为准。
- ORDER BY加速
- 排序加速前(未排序)
postgres=# select * from far order by a limit 1; a | b ---+--- 0 | 1 (1 row) Time: 323.980 ms - 排序加速后,执行查询的耗时仅为 6.971 ms。
select * from far order by a limit 1; a | b ----+---- 0 | 1 (1 row) Time: 6.971 ms
- 排序加速前(未排序)
- GROUP BY加速
- 排序加速前(未排序)
postgres=# select a,count(*) from far group by a limit 1; a | count ---------+------- 579229 | 1 (1 row) Time: 779.368 ms - 排序加速后
postgres=# select a, count(*) from far group by a limit 1; a | count ---+------- 0 | 1 (1 row) Time: 6.859 ms
- 排序加速前(未排序)
- JOIN加速
- 排序加速前(未排序),执行 JOIN 查询耗时 289.075 ms:
postgres=# select * from far t1, far t2 where t1.a = t2.a limit 1; a | b | a | b ---+---+---+--- 2 | 1 | 2 | 1 (1 row) Time: 289.075 ms - 排序加速后执行 JOIN 查询验证排序加速效果,查询耗时为 12.315 ms。说明 JOIN排序加速需要关闭ORCA功能,打开mergejoin功能,语句如下:
SET enable_mergejoin TO on; SET optimizer TO off;postgres=# select * from far t1, far t2 where t1.a = t2.a limit 1; a | b | a | b ---+---+---+--- 2 | 1 | 2 | 1 (1 row) Time: 12.315 ms
- 排序加速前(未排序),执行 JOIN 查询耗时 289.075 ms:
| - | ORDER BY | GROUP BY | JOIN |
| 加速前 | 323.980 ms | 779.368 ms | 289.075 ms |
| 加速后 | 6.971 ms | 6.859 ms | 12.315 ms |
该文章对您有帮助吗?