Redshift 查询花费太多时间

Posted

技术标签:

【中文标题】Redshift 查询花费太多时间【英文标题】:Redshift Query taking too much time 【发布时间】:2017-09-10 22:15:13 【问题描述】:

在 Redshift 中,查询的执行时间过长。一些查询会在一段时间后继续运行或中止。

我对 Redshift 的了解非常有限,并且越来越难以理解优化查询的查询计划。

与查询计划一起共享我们运行的查询之一。 执行查询需要 20 秒。

查询

SELECT
    date_trunc('day',
    ti) as date,
    count(distinct deviceID) AS COUNT    
FROM
    live_events
WHERE
    brandID = 3927
    AND ti >= '2017-08-02T00:00:00+00:00'
    AND ti <= '2017-09-02T00:00:00+00:00'
GROUP BY
    1  

主键 品牌标识

交错排序键 我们已将以下列设置为交错排序键 - 品牌ID、ti、事件名称

查询计划

【问题讨论】:

您提到“查询执行时间过长”并举了一个 20 秒的示例,但您的目标是什么(即,这个查询的可接受时间是多少)?另外 - live_events 表的 分发键 是什么? 另外,您使用了多少个节点和哪些节点类型? @Nathan 我预计它需要不到一秒钟的时间。如问题中所述,我们将“brandID”设置为主键,将brandID、ti、event_name 设置为交错排序键。没有定义其他键。 @JohnRotenstein 我们正在使用 dc1.large 类型的单个节点 主键和分布键是 Redshift 中的两个不同属性 - 主键实际上只是一个查询提示,但分布键定义了数据在 Redshift 节点之间的物理分布方式,对性能至关重要. 【参考方案1】:

您在该表中有 1.26 亿行。在单个 dc1.large 节点上将花费超过一秒的时间。

以下是一些可以提高性能的方法:

更多节点

跨更多节点传播数据可以实现更多并行化。每个节点都增加了额外的处理和存储。即使您的数据量仅证明一个节点是合理的,如果您想要更高的性能,请添加更多节点。

排序键

对于正确的查询类型,SORTKEY 可能是提高查询速度的最佳方式。对磁盘上的数据进行排序允许 Redshift 跳过它知道不包含相关数据的块。

例如,您的查询有WHERE brandID = 3927,因此将brandID 作为 SORTKEY 将使这非常有效,因为很少有磁盘块会包含一个品牌的数据。

交错排序很少是最好的排序方法,因为它比单个或复合排序键效率低,并且需要很长时间才能 VACUUM。如果您显示的查询是您正在运行的典型查询类型,则使用复合排序键 brandId, titi, brandId。效率会高很多。

SORTKEY 通常是日期列,因为它们经常出现在 WHERE 子句中,并且如果始终按时间顺序附加数据,则表将自动排序。

交错排序会导致 Redshift 读取更多磁盘块来查找您的数据,从而显着增加查询时间。

DISTKEY

DISTKEY 通常应设置为在表的 JOIN 语句中最常用的字段。这是因为与相同 DISTKEY 值相关的数据存储在同一片上。这不会对单节点集群产生如此大的影响,但仍然值得做对。

同样,您只显示了一种类型的查询,因此很难推荐 DISTKEY。仅基于此查询,我会推荐DISTKEY EVEN,以便所有切片都参与查询。 (如果没有选择特定的 DISTKEY,它也是默认的 DISTKEY。)或者,将 DISTKEY 设置为未显示的字段 - 但当然不要使用 brandId 作为 DISTKEY,否则只有一个切片将参与显示的查询。

真空

定期清理您的表,以便数据按 SORTKEY 顺序存储,并从存储中删除已删除的数据。

实验!

最佳设置取决于您的数据和您通常运行的查询。执行一些测试以比较 SORTKEY 和 DISTKEY 值并选择性能最佳的设置。然后,在 3 个月后再次测试,看看您的查询或数据是否发生了足够的变化,可以让其他设置更有效率。

【讨论】:

谢谢约翰。我们将根据您的建议进行尝试。要更改表格的排序,我们将不得不再次创建表格。您能否建议一种更好的方法将 1.25 亿数据迁移到新表中。以及完成迁移需要多长时间。 是的。最好的方法是使用您喜欢的 DISTKEY 和 SORTKEY 创建一个新表。然后执行INSERT INTO new-table SELECT * FROM old-table 复制数据。然后,您可以执行测试来比较速度,而不会影响您的原始表格。 复制这么多数据需要多少时间? 这取决于你的桌子的大小。它需要对数据进行排序,因此需要一些处理。唯一知道的方法就是尝试一下!【参考方案2】:

有时问题可能是由于其他进程获取了锁。可以参考:https://aws.amazon.com/premiumsupport/knowledge-center/prevent-locks-blocking-queries-redshift/

【讨论】:

请不要只在答案中添加链接。这些可能会变坏,然后您可能有用的答案就会丢失。因此,将相关的上下文/步骤添加到您的答案中,然后然后链接到您从中获取答案的来源。

以上是关于Redshift 查询花费太多时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中从 redshift 更快地处理数据?

查询redshift中特定表的权限(组和用户)

使用 Redshift 数据库时,SQL Join 或 SUM 返回太多值

为 Redshift 构建 SQL 查询的困难

将文件从 s3 复制到 redshift 花费的时间太长

删除 Redshift 中的循环