Amazon web services 红移性能:SQL查询与表规范化

Amazon web services 红移性能:SQL查询与表规范化,amazon-web-services,amazon-redshift,query-performance,database-normalization,amazon-kinesis,Amazon Web Services,Amazon Redshift,Query Performance,Database Normalization,Amazon Kinesis,我正在构建一个红移数据库,通过监听来自不同来源的事件,并将数据注入红移集群 我们的想法是使用Kinesis firehose使用COPY命令将数据传输到红移。但我在这里遇到了一个难题:我希望首先使用select查询从redshift查询一些信息,例如下面的查询: select A, B, C from redshift__table where D='x' and E = 'y'; 从redshift获得所需信息后,我将把这些信息与我的事件通知数据结合起来,并向kinesis发出请求。然后,K

我正在构建一个红移数据库,通过监听来自不同来源的事件,并将数据注入红移集群

我们的想法是使用Kinesis firehose使用COPY命令将数据传输到红移。但我在这里遇到了一个难题:我希望首先使用select查询从redshift查询一些信息,例如下面的查询:

select A, B, C from redshift__table where D='x' and E = 'y';
从redshift获得所需信息后,我将把这些信息与我的事件通知数据结合起来,并向kinesis发出请求。然后,Kinesis将完成其工作并发出所需的复制命令


现在我的问题是,重复查询redshift(比如说每秒一次)是否是一个好主意,因为这是我收到事件通知的预期时间

现在让我描述另一种情况:

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

但这种方法的缺点是,一旦我将数据放入红移,我就必须在对红移数据执行实时分析的同时执行表连接

因此,我希望从更高的层面上了解哪种方法更好:

  • 有一个单一的平面表,但在向kinesis发出事件通知请求之前查询它。执行分析时不会有任何表联接

  • 有2个表,查询红移的频率较低。但在使用BI/分析工具显示结果时执行表联接


  • 你认为这两个选项中哪一个更好?让我们假设在这两种情况下我都将使用适当的排序键/分发键。

    我肯定会选择您的第二个选项,其中包括加入查询。这就是AmazonRedshift擅长做的(尤其是如果您正确设置了SORTKEY和DISTKEY)

    让流数据以最有效的方式红移,然后在执行查询时加入。这样的话,你的查询就会少很多


    或者,您可以运行一个常规作业(例如每小时一次),将数据批处理到一个宽表中。这取决于加载后查询数据所需的速度。

    您所说的一般和此处的确切含义是什么?可能会消除“非原子”值?唉:“最佳”(1)在提问者定义它之前毫无意义,(2)依赖于如此多的高层次到低层次的细节(使用、实施、资源、成本效益),必须进行经验测试。“适当的密钥分配”是正确的方向。尝试确定“最佳”和2个设计,以便对您的worflow和设置进行客户评估和测试。“重复查询redshift(比如说每秒钟一次)是否是一个好主意”-redshift不是OLTP样式的数据库,因此针对较少的非常大的查询进行了优化,而不是针对许多非常小的查询。您可能会发现,在这种情况下,响应时间不够快,无法每秒执行一次查询。您还需要考虑并发(允许并发查询的数量)-在集群中有50的最大并发性,因此您的进程将几乎永久地使用可用时隙之一。我也倾向于第二种选择。我想这是最好的办法。所以我接受你的回答。我只是想要一个开始。也许我也要用经验来检验一下。谢谢