首页 > 解决方案 > 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        |
+-------------------+-----------+----------------+------------+-----------------+-------------+

如何提高查询的性能?

标签: amazon-redshift

解决方案


检查连接子句中列的数据类型。当它们不相同时,我已经看到 redshift 广播了事务表。


推荐阅读