Redshift 性能:SQL 查询与 table 规范化

Redshift performance: SQL queries vs table normalization

我正在通过侦听来自不同来源的事件并将该数据泵入 redshift 集群来构建 redshift 数据库。

这个想法是使用 Kinesis firehose 使用 COPY 命令将数据泵送到红移。但是我在这里进退两难:我希望首先使用 select 查询从 redshift 查询一些信息,如下所示:

select A, B, C from redshift__table where D='x' and E = 'y';

从 redshift 获取所需信息后,我会将这些信息与我的事件通知数据结合起来,并向 kinesis 发出请求。然后 Kinesis 将执行其工作并发出所需的 COPY 命令。

现在我的问题是,像每秒这样重复查询 redshift 是个好主意,因为那是我收到事件通知的预期时间?

现在让我描述一个替代场景:

如果我规范化我的 table 并将一些字段分离到一个单独的 table 中,那么我将不得不使用规范化设计执行更少的红移查询(可能每 30 秒一次)

但这种方法的缺点是,一旦我将数据放入 redshift,我将不得不在对我的 redshift 数据执行实时分析时执行 table 连接。

所以我想知道哪种方法更好:

  1. 有一个公寓 table 但在根据事件通知发出对 kinesis 的请求之前查询它。执行分析时不会有任何 table 连接。

  2. 有 2 table 并且不经常查询红移。但是在使用 BI/analytical 工具显示结果时执行 table 连接。

您认为这两个选项中哪个更好?让我们假设在任何一种情况下我都会使用适当的排序 keys/distribution 键。

我肯定会选择你的第二个选项,它涉及 JOINing 和查询。这就是 Amazon Redshift 擅长做的事情(尤其是当您正确设置了 SORTKEY 和 DISTKEY 时)。

让流数据以最高效的方式进入Redshift,然后在查询时加入。这样你的查询就会少很多。

或者,您可以 运行 一项常规工作(例如每小时一次)将数据批量处理成一个宽 table。这取决于加载后查询数据的速度。