如何避免大表的红移偏移?

How to avoid skewing in redshift for Big Tables?

我想将 table 大小超过 1 TB 的 table 从 S3 加载到 Redshift。

我不能将 DISTSTYLE 用作 ALL,因为它很大 table。

我不能将 DISTSTYLE 用作 EVEN,因为我想在造成性能问题的联接中使用此 table。

我的 table 上的列是

id 整数,名称 VARCHAR(10),another_id 整数,工作日整数,工作时间整数,worktime_number 整数

我们的 redshift 集群有 20 个节点。

所以,我在工作日尝试了分发密钥,但 table 严重倾斜。

有 7 个独特的工作日和 24 个独特的工作时间。

这种情况下如何避免偏斜?

我们如何避免 table 在唯一键的行数不均匀的情况下出现偏差(假设 hour1 有 100 万行,hour2 有 150 万行,hour3 有 200 万行,等等)上)?

使用 DISTSTYLE EVEN 分发您的 table 并使用 SORTKEYCOMPOUND SORTKEY。排序键将有助于您的查询性能。先试试这个。

DISTSTYLE/DISTKEY 确定您的数据分布方式。从您的查询中使用的列中,建议选择一个导致偏差最少的列作为 DISTKEY。具有许多不同值的列(例如时间戳)将是不错的首选。避免具有不同值的列,例如信用卡类型或星期几。

您可能需要使用不同的 DISTKEY / SORTKEY 组合重新创建 table,并根据您的典型查询尝试哪一种最有效。

更多信息https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-sort-key.html

这是我推荐的架构

1) 使用 dist even 加载到暂存 table 并按在加载的 s3 数据上排序的内容进行排序 - 这意味着您不必清理暂存 table

2) 使用查询所需的排序/距离设置生产 table。在每次从 s3 复制后,将新数据加载到生产 table 和真空中。

3) 您可能希望有 2 个镜像生产 tables 并使用后期绑定视图在它们之间进行触发器。

执行此操作有点复杂,您可能需要一些专业帮助。您的用例可能有具体细节。

在撰写本文时(就在 Re-invent 2018 之后),Redshift 提供了自动分发功能,这是一个很好的入门。

以下实用程序会派上用场:

https://github.com/awslabs/amazon-redshift-utils/tree/master/src/AdminScripts

如前面发布的答案中所示,如果您不喜欢自动 DIST 的功能,请尝试使用不同的 DIST 键复制相同的 table 来尝试一些组合。在创建 tables 后 运行 来自 git 存储库的管理实用程序(最好在 Redshift 数据库中的 SQL 脚本上创建一个视图)。

此外,如果您对查询使用模式非常清楚,那么您可以使用以下查询来检查排序键的执行情况,使用下面的 SQLs。

/**Queries on tables that are not utilizing SORT KEYs**/

SELECT t.database, t.table_id,t.schema, t.schema || '.' || t.table AS "table", t.size, nvl(s.num_qs,0) num_qs
FROM svv_table_info t
LEFT JOIN (
SELECT tbl, COUNT(distinct query) num_qs
FROM stl_scan s
WHERE s.userid > 1
AND s.perm_table_name NOT IN ('Internal Worktable','S3')
GROUP BY tbl) s ON s.tbl = t.table_id
WHERE t.sortkey1 IS NULL
ORDER BY 5 desc;

/**INTERLEAVED SORT KEY**/
--check skew
select tbl as tbl_id, stv_tbl_perm.name as table_name, 
col, interleaved_skew, last_reindex
from svv_interleaved_columns, stv_tbl_perm
where svv_interleaved_columns.tbl = stv_tbl_perm.id
and interleaved_skew is not null;

当然,上面的 SQL 总是有改进的余地,这取决于您可能想要查看或深入了解的特定统计数据。

希望对您有所帮助。