amazon-redshift - Redshift XN 排序成本
问题描述
我有一个性能很差的查询。
在这里发布它太大了,但基本上它会选择几列并检查它们属于哪个范围,例如
CASE WHEN col < 3 THEN 'A' WHEN col BETWEEN 3 AND 5 THEN 'B' etc.
然后它计算'A','B'等
380M 行的执行时间为 15 分钟。
它没有 DISTINCT,也没有连接,除了连接到一个小维度表。
当我运行解释时,它显示以下查询计划
+-----------------------------------------------------------------------------------------------------------------+
| QUERY PLAN |
|-----------------------------------------------------------------------------------------------------------------|
| XN Merge (cost=1000011702317.03..1000011702317.16 rows=53 width=48) |
| Merge Key: programme_session.start_date |
| -> XN Network (cost=1000011702317.03..1000011702317.16 rows=53 width=48) |
| Send to leader |
| -> XN Sort (cost=1000011702317.03..1000011702317.16 rows=53 width=48) |
| Sort Key: programme_session.start_date |
| -> XN HashAggregate (cost=11702160.75..11702315.51 rows=53 width=48) |
| -> XN Hash Join DS_DIST_ALL_NONE (cost=105.08..11499929.95 rows=2186279 width=48) |
| Hash Cond: ("outer".start_date = "inner".tk) |
| -> XN Seq Scan on programme_session (cost=0.00..5101316.48 rows=510131648 width=48) |
| -> XN Hash (cost=105.00..105.00 rows=30 width=4) |
| -> XN Seq Scan on dim_date dd (cost=0.00..105.00 rows=30 width=4) |
| Filter: (("year" = 2019) AND ("month" = 6)) |
+-----------------------------------------------------------------------------------------------------------------+
在这里,我看到了从 XN HashAggregate 到 XN Sort 的成本爆炸式增长。
可能是什么原因?
该表按 start_date 排序,我只运行 VACUUM SORT 并且偏差值不是很大:
+-------------------+-----------+----------------+------------+-----------------+-------------+
| table | encoded | diststyle | sortkey1 | skew_sortkey1 | skew_rows |
|-------------------+-----------+----------------+------------+-----------------+-------------|
| programme_session | Y | KEY(device_id) | start_date | 2.26 | 1.00 |
+-------------------+-----------+----------------+------------+-----------------+-------------+
如何提高查询的性能?
解决方案
检查连接子句中列的数据类型。当它们不相同时,我已经看到 redshift 广播了事务表。
推荐阅读
- laravel - 如何在laravel中将集合变成数组
- postgresql - PostgreSQL 中文本列更新的性能
- javascript - 运行任务后如何终止CircleCI?
- matlab - 使用 Matlab 创建 PDF
- android - Flutter 后台任务
- python - os.walk() 更通用的 os.path.basename?
- azure - 有没有其他方法可以将 raspi 连接到 azure devops 管道?
- c# - 每个条目具有不同类型的通用函数字典
- laravel - Laravel 与复合外键的关系
- swift - Validatable 模型的自定义验证错误消息