Redshift 集群:查询挂起并填满 space

Redshift cluster: queries getting hang and filling up space

我有一个包含 3 个节点的 Redshift 集群。时不时地,随着用户 运行 对它的查询,我们以这种令人不快的情况结束,其中一些查询 运行 的时间比预期的要长(即使是简单的,超过 15 分钟),并且集群存储开始增加,如果您不终止长期存在的查询,它就会占用 100% 的存储空间。

我想知道为什么会这样。我的经历多种多样,有时是单个查询执行此操作,有时是不同的并发查询同时 运行。

当构造不当的查询将过多数据溢出到磁盘时,通常会发生这种情况。例如,用户不小心指定了笛卡尔积(tblA 的每一行连接到 tblB 的每一行)。

如果这种情况经常发生,您可以实施 QMR 规则来限制查询中止之前的磁盘溢出量。

我们看到这种情况发生的一个特定场景与 LISTAGG 有关。 LISTAGG 的类型是 varchar(65535),虽然 Redshift 在存储到磁盘时优化了隐式尾随空白,但在处理过程中内存中需要完整宽度。

如果您有一个 returns 一百万行的查询,您最终会得到 1,000,000 行乘以每个 LISTAGG 65,535 字节,即 65 GB。这会很快让您陷入您所描述的情况,查询花费的时间意外地长或因“磁盘已满”错误而失败。

我的团队前几天on our team blog对此进行了更多讨论。