Amazon redshift 红移集群:查询挂起并填充空间

Amazon redshift 红移集群:查询挂起并填充空间,amazon-redshift,distributed-system,Amazon Redshift,Distributed System,我有一个红移集群,有3个节点。偶尔,当用户对其运行查询时,我们会遇到这样一种令人不快的情况:一些查询的运行时间比预期的长(即使是简单的查询,也超过15分钟),集群存储开始增加,如果不终止长期查询,它将占用100%的存储空间 我想知道为什么会发生这种情况。我的经验是多种多样的,有时是单个查询执行此操作,有时是同时运行不同的并发查询。当构造不良的查询将太多数据溢出到磁盘时,通常会发生这种情况。例如,用户意外地指定了一个笛卡尔乘积(tblA的每一行都连接到tblB的每一行) 如果这种情况经常发生,您可

我有一个红移集群,有3个节点。偶尔,当用户对其运行查询时,我们会遇到这样一种令人不快的情况:一些查询的运行时间比预期的长(即使是简单的查询,也超过15分钟),集群存储开始增加,如果不终止长期查询,它将占用100%的存储空间


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

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

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

  • QMR文件:
  • QMR规则候选查询:

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

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

  • QMR文件:
  • QMR规则候选查询:

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

如果您有一个返回一百万行的查询,那么每个
LISTAGG
的结果是1000000行乘以65535字节,即65GB。这会很快让您陷入您所描述的情况,查询会花费意外的时间,或者出现“磁盘已满”错误而失败


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

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

如果您有一个返回一百万行的查询,那么每个
LISTAGG
的结果是1000000行乘以65535字节,即65GB。这会很快让您陷入您所描述的情况,查询会花费意外的时间,或者出现“磁盘已满”错误而失败


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

您是否同时运行etl?dms?是的,我有一些在iti上连续运行的ETL作业。当ETL和查询作业之间发生争用时,我也遇到了类似的问题。可能有很多更新直到最后才提交。进行较小的提交批次可能会减少临时存储需求。你还可以找到空间的去向。你的工作肯定会相互竞争。这可以通过使用为不同类别的查询(例如ETL与即席查询)提供有保证的资源来最小化。然而,您的磁盘空间耗尽更令人担忧,应该首先调查哪些活动正在消耗磁盘空间。您是否同时运行etl?dms?是的,我有一些在iti上连续运行的ETL作业。当ETL和查询作业之间发生争用时,我也遇到了类似的问题。可能有很多更新直到最后才提交。进行较小的提交批次可能会减少临时存储需求。你还可以找到空间的去向。你的工作肯定会相互竞争。这可以通过使用为不同类别的查询(例如ETL与即席查询)提供有保证的资源来最小化。但是,您的磁盘空间耗尽更令人担忧,应该首先调查哪些活动占用了磁盘空间。这是有道理的,但在我的情况下,查询通常只需要很少的时间,有时需要更长的时间,最终会填满集群。这是有道理的,但在我的例子中,查询通常只需要很少的时间,有时需要更长的时间,最终会填满集群。