我想将表大小超过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
分配表,并使用SORTKEY
或COMPOUND 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总是有改进的空间,这取决于您可能想要查看或深入到的特定统计数据。
希望这能有所帮助。