amazon-redshift - 红移优化:减少 i/o 偏差,还是坚持使用连接中使用的 dist 键?
问题描述
一般来说,当有一张表的 dist key 导致高度 I/O skew但又用于该表和其他表之间的连接操作(也使用相同的 key 分布)时,最好选择一个不同的 dist 键(或“偶数”)以减少偏斜,即使这会导致在连接期间在节点之间移动更多行?
还是逐案处理,无法给出一般性答案?
解决方案
一般来说,您要确保在使用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
.
推荐阅读
- php - 日期过滤器未显示正确的结果
- c# - 固定大小缓冲区不支持非托管类型的任何原因?
- ruby-on-rails - 未捕获的类型错误:$(...).sortable 不是 Rails 6 中的函数
- laravel - 3 表 Laravel 迁移需要建议
- python - pip install, 如何修复 ImportError
- c# - 在 C# 源代码中将 DLL 放在哪里?
- python - 在测试模式下无法单击添加到购物车按钮
- google-chrome-devtools - chrome devtools 的问题显示组件边框
- c++ - 将“VkImage”清除为单一颜色的最佳方法是什么?
- python - 使用 Apahce-beam 在 Python 中删除字典中的第一项