如何避免大表的redshift倾斜?

时间:2018-12-06 22:23:34

标签: amazon-redshift skew

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

我不能将DISTSTYLE用作ALL,因为它是一个大桌子。

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

我桌上的列是

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

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

因此,我在一个工作日尝试使用分发密钥,但是表严重偏斜。

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

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

在唯一键的行数不均匀的情况下(假设hour1有100万行,hour2有150万行,hour3有200万行,等等),我们如何避免表的歪斜?

3 个答案:

答案 0 :(得分:1)

使用DISTSTYLE EVEN分配表,并使用SORTKEYCOMPOUND SORTKEY。排序键将帮助您提高查询性能。先尝试一下。

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

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

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

答案 1 :(得分:0)

这是我推荐的体系结构

1)将dist偶数加载到登台表中,并根据对已加载的s3数据进行排序的内容进行排序-这意味着您不必清理登台表

2)设置一个生产表,其中包含查询所需要的sort / dist。从s3复制完每个副本后,将新数据加载到生产表中并进行清理。

3)您可能希望有2个镜像生成表,并使用后期绑定视图在它们之间创建触发器。

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

答案 2 :(得分:0)

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

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

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

如先前答案中所述,如果您不喜欢自动DIST的功能,请尝试通过使用不同的DIST键复制同一张表来尝试几种组合。创建表后,从git repos运行管理实用程序(最好在Redshift DB中的SQL脚本上创建一个视图)。

此外,如果您对查询使用模式有很好的了解,则可以使用以下查询来检查使用以下SQL的排序键的性能。

/**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总是有改进的余地,这取决于您可能希望查看或深入研究的特定统计信息。

希望这会有所帮助。