如何避免Big Tables的红移偏移



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

我不能使用DISSTYLE作为ALL,因为它是一张大桌子。

我不能将DISSTYLE用作EVEN,因为我想在导致性能问题的联接中使用此表。

我桌子上的列是

id INTEGER,name VARCHAR(10(,another_id INTEGER

我们的红移星团有20个节点。

所以,我在一个工作日尝试了分发密钥,但表严重扭曲。

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

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

如果唯一键的行数不均匀(假设小时1有100万行,小时2有150万行,时间3有200万行,依此类推(,我们如何避免表的倾斜?

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

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

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

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

以下是我推荐的架构

1( 使用dist-eeven加载到一个临时表,并根据加载的s3数据排序——这意味着你不必清空临时表

2( 使用查询所需的sort/dist设置一个生产表。每次从s3复制后,将新数据加载到production表中并清空。

3( 您可能希望有2个镜像生产表,并使用后期绑定视图在它们之间切换。

做这件事有点复杂,你可能需要一些专业帮助。您的用例可能有一些细节。

截至本文撰写之时(2018年重新发明后(,Redshift提供了自动分配功能,这是一个很好的开端。

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

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

如前所述,如果您不喜欢Automatic DIST所做的工作,请尝试使用不同的DIST键复制同一个表,进行几种组合。创建表后,从git-reos运行管理实用程序(最好在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总是有改进的空间,这取决于您可能想要查看或深入到的特定统计数据。

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新