首页 > 解决方案 > 红移优化:减少 i/o 偏差,还是坚持使用连接中使用的 dist 键?

问题描述

一般来说,当有一张表的 dist key 导致高度 I/O skew但又用于该表和其他表之间的连接操作(也使用相同的 key 分布)时,最好选择一个不同的 dist 键(或“偶数”)以减少偏斜,即使这会导致在连接期间在节点之间移动更多行?

还是逐案处理,无法给出一般性答案?

标签: amazon-redshiftdatabase-performancedatabase-tuning

解决方案


一般来说,您要确保在使用DISTKEY它时位于“唯一”(不是日期或某种类型的维度)字段上。这样,您就不会在任何特定节点/切片(数据倾斜)上堆叠相同类型的哈希。

绝对值得使用以下查询检查有多少数据是倾斜的以及百分比是多少:

SELECT SCHEMA schemaname,
       "table" tablename,
       table_id tableid,
       size size_in_mb,
       CASE
         WHEN diststyle NOT IN ('EVEN','ALL') THEN 1
         ELSE 0
       END has_dist_key,
       CASE
         WHEN sortkey1 IS NOT NULL THEN 1
         ELSE 0
       END has_sort_key,
       CASE
         WHEN encoded = 'Y' THEN 1
         ELSE 0
       END has_col_encoding,
       CAST(max_blocks_per_slice - min_blocks_per_slice AS FLOAT) / GREATEST(NVL (min_blocks_per_slice,0)::int,1) ratio_skew_across_slices,
       CAST(100*dist_slice AS FLOAT) /(SELECT COUNT(DISTINCT slice) FROM stv_slices) pct_slices_populated
FROM svv_table_info ti
  JOIN (SELECT tbl,
               MIN(c) min_blocks_per_slice,
               MAX(c) max_blocks_per_slice,
               COUNT(DISTINCT slice) dist_slice
        FROM (SELECT b.tbl,
                     b.slice,
                     COUNT(*) AS c
              FROM STV_BLOCKLIST b
              GROUP BY b.tbl,
                       b.slice)
        WHERE tbl IN (SELECT table_id FROM svv_table_info)
        GROUP BY tbl) iq ON iq.tbl = ti.table_id;

访问此分析链接了解更多详情!

话虽如此,如果您看到较大的偏差 % 并且您知道DISTKEY是导致它的原因,那么我建议您删除它并使用DISTSTYLE EVEN并可能查看SORT KEYS.


推荐阅读