【发布时间】:2019-05-11 12:01:07
【问题描述】:
我在 Redshift 上遇到了严重的性能问题,我已经开始重新考虑我的表结构。
现在,我正在识别仪表板上最重要的表格。首先,我运行以下查询:
SELECT * FROM admin.v_extended_table_info
WHERE table_id IN (
SELECT DISTINCT s.tbl FROM stl_scan s
JOIN pg_user u ON u.usesysid = s.userid
WHERE s.type=2 AND u.usename='looker'
)
ORDER BY SPLIT_PART("scans:rr:filt:sel:del",':',1)::int DESC,
size DESC;
根据查询结果,我可以识别出许多分布为EVEN 的小表(1-1000 条记录),也可能是ALL - 这些表用于很多连接指令。
除此之外,我发现我的 99% 的表都在使用 EVEN 而没有排序键。我没有使用非规范化表,因此我需要运行大量连接来获取数据——据我所知,EVEN 不适合连接,因为它可以分布在网络上。
我有 3 个与工单流相关的表:用户、工单和工单历史记录。所有这些表都是EVEN,没有排序键,diststyle 为EVEN。
现在,我想重新设计表 user:此表用于连接条件 ticket.user_id = user.id 和 where 子句,如 user.email = 'xxxx@xxxx.com' 或 user.email like '%@something.com%' 或 group by user.email。
我打算做的第一件事是使用 diststyle 作为分布,并使用 id 的键。使用唯一值作为 dist 键有意义吗?我已经阅读了很多关于 dist 键的帖子,但仍然让我感到困惑。
由于排序键有意义,所以使用电子邮件作为复合键?我已经阅读以避免像日期、时间戳或身份一样增长的列,这就是为什么我不使用它作为交错。为了避免like,我计划创建一个新列来识别什么是电子邮件域。
之后,我会将小表更改为 dist ALL 并再次尝试查询。
我走对了吗?还有什么提示吗?
这个问题听起来很愚蠢,但我的技术背景只是软件开发,我正在学习 Redshift 并阅读大量文档。
【问题讨论】:
标签: amazon-web-services amazon-redshift