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 连接。
所以我想知道哪种方法更好:
有一个公寓 table 但在根据事件通知发出对 kinesis 的请求之前查询它。执行分析时不会有任何 table 连接。
有 2 table 并且不经常查询红移。但是在使用 BI/analytical 工具显示结果时执行 table 连接。
您认为这两个选项中哪个更好?让我们假设在任何一种情况下我都会使用适当的排序 keys/distribution 键。
我肯定会选择你的第二个选项,它涉及 JOINing 和查询。这就是 Amazon Redshift 擅长做的事情(尤其是当您正确设置了 SORTKEY 和 DISTKEY 时)。
让流数据以最高效的方式进入Redshift,然后在查询时加入。这样你的查询就会少很多。
或者,您可以 运行 一项常规工作(例如每小时一次)将数据批量处理成一个宽 table。这取决于加载后查询数据的速度。
我正在通过侦听来自不同来源的事件并将该数据泵入 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 连接。
所以我想知道哪种方法更好:
有一个公寓 table 但在根据事件通知发出对 kinesis 的请求之前查询它。执行分析时不会有任何 table 连接。
有 2 table 并且不经常查询红移。但是在使用 BI/analytical 工具显示结果时执行 table 连接。
您认为这两个选项中哪个更好?让我们假设在任何一种情况下我都会使用适当的排序 keys/distribution 键。
我肯定会选择你的第二个选项,它涉及 JOINing 和查询。这就是 Amazon Redshift 擅长做的事情(尤其是当您正确设置了 SORTKEY 和 DISTKEY 时)。
让流数据以最高效的方式进入Redshift,然后在查询时加入。这样你的查询就会少很多。
或者,您可以 运行 一项常规工作(例如每小时一次)将数据批量处理成一个宽 table。这取决于加载后查询数据的速度。