首页 > 解决方案 > Redshift CREATE TABLE AS 从简单查询中花费很长时间

问题描述

当我自己运行某个查询时,它会在不到 1 秒的时间内返回。当我尝试使用 CREATE TABLE (name) AS 从该查询创建表时,它运行了长达 15 分钟而没有完成。

我做了很多表作为查询,没有这个问题。是否应该花费更长的时间从一个查询中创建一个表,而该查询本身需要不到一秒钟的时间才能返回?

标签: sqlamazon-redshift

解决方案


在您的情况下,我非常怀疑数据库中的其他一些用户是否正在使用一些性能负担查询来访问集群,因此它会将大量查询分配给该查询,因此很难执行其他查询,例如您的创建。


作为参考,以下是可能会减慢查询速度的元素(下面的源链接):

  • 节点、处理器或切片的数量:计算节点被划分为切片。更多节点意味着更多处理器和更多切片,这使您的查询处理速度更快。

  • 节点类型– Amazon Redshift 集群可以使用密集存储或密集计算节点。密集存储节点类型推荐用于大量数据存储需求,而密集计算节点类型针对性能密集型工作负载进行了优化。每种节点类型都提供不同的大小和限制,以帮助您适当地扩展集群。节点大小决定了集群中每个节点的存储容量、内存、CPU和价格。

  • 数据分布– Amazon Redshift 根据表的分布方式将表数据存储在计算节点上。当您执行查询时,查询优化器会根据需要将数据重新分配到计算节点以执行任何连接和聚合。为表选择正确的分布样式有助于通过在执行联接之前将数据定位在需要的位置来最大限度地减少重新分布步骤的影响。

  • 数据排序顺序– Amazon Redshift 根据表的排序键将表数据按排序顺序存储在磁盘上。查询优化器和查询处理器使用有关数据所在位置的信息来减少需要扫描的块数,从而提高查询速度。有关详细信息,请参阅选择排序键。

  • 数据集大小——集群中的数据量越大,查询的查询性能就越慢,因为需要扫描和重新分配更多的行。您可以通过定期清理和归档数据以及使用谓词来限制查询数据集来减轻这种影响。

  • 并发操作(最频繁) ——一次运行多个操作会影响查询性能。每个操作在可用查询队列中占用一个或多个槽,并使用与这些槽关联的内存。如果其他操作正在运行,则可能没有足够的查询队列槽可用。在这种情况下,查询必须等待槽打开才能开始处理。有关创建和配置查询队列的更多信息,请参阅实施工作负载管理。

  • 查询结构——查询的编写方式会影响其性能。尽可能编写查询来处理和返回满足您需求的尽可能少的数据。有关更多信息,请参阅设计查询的 Amazon Redshift 最佳实践。

  • 代码编译– Amazon Redshift 为每个查询执行计划生成和编译代码。编译后的代码执行得更快,因为它消除了使用解释器的开销。第一次生成和编译代码时,您通常会产生一些间接成本。因此,第一次运行查询时的性能可能会产生误导。当您运行一次性查询时,开销成本可能会特别明显。再次运行查询以确定其典型性能。同样,在比较从不同客户端发送的相同查询的性能时要小心。执行引擎为 JDBC 连接协议以及 ODBC 和 psql (libpq) 连接协议生成不同的代码。如果两个客户端使用不同的协议,每个客户端都会产生第一次生成编译代码的成本,即使对于相同的查询也是如此。但是,使用相同协议的其他客户端可以从共享缓存代码中受益。使用 ODBC 的客户端和使用 libpq 运行 psql 的客户端可以共享相同的编译代码。编译后的代码段本地存储在集群上,远程存储在 AWS 账户级缓存中。相同查询的后续执行可以更快地运行,因为它可以跳过编译阶段。集群重启后缓存仍然存在,但会被维护升级擦除。当本地缓存未命中时,将使用远程共享缓存。如果有远程缓存命中,则将缓存的项目提取到本地缓存。远程缓存在同一 AWS 账户内的集群之间共享。因此,查询可以运行得更快:使用 ODBC 的客户端和使用 libpq 运行 psql 的客户端可以共享相同的编译代码。编译后的代码段本地存储在集群上,远程存储在 AWS 账户级缓存中。相同查询的后续执行可以更快地运行,因为它可以跳过编译阶段。集群重启后缓存仍然存在,但会被维护升级擦除。当本地缓存未命中时,将使用远程共享缓存。如果有远程缓存命中,则将缓存的项目提取到本地缓存。远程缓存在同一 AWS 账户内的集群之间共享。因此,查询可以运行得更快:使用 ODBC 的客户端和使用 libpq 运行 psql 的客户端可以共享相同的编译代码。编译后的代码段本地存储在集群上,远程存储在 AWS 账户级缓存中。相同查询的后续执行可以更快地运行,因为它可以跳过编译阶段。集群重启后缓存仍然存在,但会被维护升级擦除。当本地缓存未命中时,将使用远程共享缓存。如果有远程缓存命中,则将缓存的项目提取到本地缓存。远程缓存在同一 AWS 账户内的集群之间共享。因此,查询可以运行得更快:集群重启后缓存仍然存在,但会被维护升级擦除。当本地缓存未命中时,将使用远程共享缓存。如果有远程缓存命中,则将缓存的项目提取到本地缓存。远程缓存在同一 AWS 账户内的集群之间共享。因此,查询可以运行得更快:集群重启后缓存仍然存在,但会被维护升级擦除。当本地缓存未命中时,将使用远程共享缓存。如果有远程缓存命中,则将缓存的项目提取到本地缓存。远程缓存在同一 AWS 账户内的集群之间共享。因此,查询可以运行得更快:

    • 当查询在同一帐户的不同集群上运行时。
    • 当查询在集群中的不同会话中运行时。
    • 通常,当查询具有不同的查询参数但执行计划相同时。

[影响查询性能的因素] https://docs.aws.amazon.com/redshift/latest/dg/c-query-performance.html


推荐阅读