我们正在构建一个商业智能系统,我们有一个巨大的 PostgreSQL 数据库 (DB),可以在其中进行所有信息处理,还有一个 Redshift 数据仓库 (DWH),可以在其中存储数据并执行查询。
后端是用 Java Server Faces (JSF) 构建的,之前的查询都是线性的。有些视图需要一分多钟的时间才能完成查询并将信息加载到屏幕中,因此我们决定在 Java 中使用线程并使查询异步。
因此,我们为每个视图准备了必要的查询,以便从我们的 EC2 应用程序机器并行运行到我们的 Redshift DWH,并运行线程,但视图仍然需要很长时间才能加载,有时甚至更长。
我们在文档中发现:
http://docs.aws.amazon.com/redshift/latest/dg/cm-c-executing-queries.html
http://docs.aws.amazon.com/redshift/latest/dg/c_troubleshooting_query_performance.html
http://docs.aws.amazon.com/redshift/latest/dg/r_wlm_query_slot_count.html
默认情况下,redshift 同时接收 5 个查询,但我们可以更改此设置。
有 3 个主要因素需要考虑:查询槽、并发和队列。我们已经明白了这一点:
队列就像 Java 中的线程。查询到达并被指定到“负载较少”队列,然后等待轮到它得到解决。我们可以有任意数量的队列。队列分配了一些内存(我们猜是平均分配的?)在队列中我们可以分配用户组或查询组。但短期来看,我们现在无法在查询中完成大量分类工作。
并发度是队列可以并行运行的查询量。默认为 5。
查询槽是查询可以使用的内存量。正如我们所理解的,它与并发有关。队列的并发性越高,每个查询槽中的内存就越少。
我们尝试过有 3 个队列,每个队列并发数为 5,但性能仍然很慢。
那么,如果我们理解正确的话,有些视图会进行 25-28 次查询,并且总加载时间约为 60 秒,那么我们如何保留设置才能更快地解决查询呢?
performance parallelism redshift amazon-rds query-performance