我对 Redshift 很陌生,但在 BI 领域有相当多的经验。我需要专业的 Redshift 开发人员的帮助。这是我的情况:我在 Redshift 中添加了一个外部 (S3) 数据库。这将遭受非常频繁的变化,大约。每 15 分钟一次。我将直接从 Qlik Sense 对这个外部数据库运行大量并发查询。正如最佳实践所说,当较小的表驻留在 Redshift 中时,Redshift + Spectrum 效果最好,我决定将一些计算维度表移动到本地,并将外部表留在 S3 中。我面临的挑战是它是否更适合为此或表使用物化视图。
我已经用 DIST STYLE = ALL 和正确的 SORT KEY 测试了两者,测试表明 MV 更快。我只是不明白为什么会这样。考虑到维度表相当小(<3 百万行),我有以下问题:
- 我们应该使用 MV 并通过计划任务刷新它们还是使用表并通过存储过程(也许)执行某种形式的 ETL 来刷新它。
- 如果使用表:我尝试将 varchar 键(在连接中大量使用)强制转换为 bigint 以强制编码为 AZ64,但查询的性能比不进行转换(其中 encode=LZO)更差。这是因为在外部数据库中它存储为 varchar 吗?
- 如果使用 MV:我也尝试在 MV 后面的查询中进行上述转换,但编码显示为 NONE(通过检查在场景后面创建的表来确定)。此外,即使没有强制转换,连接中使用的大多数键列也没有编码。可能这就是 MV 比 table 快的原因吗?我不应该期待相反的情况 - 没有编码 = 性能更差吗?
更多信息:在 S3 中,我们以 parquet 文件的形式存储,并进行了适当的分区。在 Redshift 中,这些表是根据与 S3 分区相同的列以及更多列进行排序的。并且所有查询都以相同的顺序对这些列使用连接,并且还在这些列的 where 子句中使用过滤器。所以查询结构良好。
如果您需要任何其他详细信息,请告诉我。