影响查询性能的因素
有很多因素会影响查询性能。数据、集群和数据库操作的以下方面都在查询处理速度方面发挥作用。
-
节点、处理器或切片的数量 – 一个计算节点分为多个切片。节点越多意味着处理器和切片越多,通过跨各个切片并发运行查询的多个部分,可加快查询的处理速度。但是,节点越多也意味着花费越高,因此,您需要为自己的系统找到成本和性能之间的适当平衡点。有关 Amazon Redshift 集群架构的更多信息,请参阅数据仓库系统架构。
-
节点类型 – Amazon Redshift 集群有多种节点类型可以选择。每种节点类型都提供不同的大小和限制,以帮助您适当地扩展集群。节点大小决定集群中每个节点的存储容量、内存、CPU 和价格。有关节点类型的更多信息,请参阅《Amazon Redshift 管理指南》中的 Amazon Redshift 集群概述。
-
数据分配 – Amazon Redshift 根据表的分配方式在计算节点上存储表数据。在执行查询时,查询优化程序根据执行联接和聚合的需要将数据重新分配到计算节点。为表选择正确的分配方式有助于通过在执行联接前将数据放在需要的位置来最大程度地减小重新分配步骤的影响。有关更多信息,请参阅 使用数据分配样式。
-
数据排序顺序 – Amazon Redshift 根据表的排序键将表数据按照排序顺序存储在磁盘中。查询优化程序和查询处理器使用有关数据所在位置的信息来减少需要扫描的数据块数,从而提高查询速度。有关更多信息,请参阅 使用排序键。
-
数据集大小 – 集群中的数据量越大,则需要扫描和重新分配的行数也越多,这会降低查询性能。您可以通过定期对数据进行 vacuum 操作和归档以及使用谓词来限制查询数据集来减轻这种影响。
-
并发操作 – 同时运行多个操作会影响查询性能。每个操作在可用查询队列中都会占用一个或多个插槽,并使用与这些插槽关联的内存。如果其他操作正在运行,则可能没有充足的查询队列槽可用。在这种情况下,查询必须等待有槽回收后才能开始处理。有关创建和配置查询队列的更多信息,请参阅实施工作负载管理。
-
查询结构 – 查询的编写也会影响其性能。在满足需求的前提下,请尽量将查询编写为处理和返回尽量少的数据。有关更多信息,请参阅 设计查询的 Amazon Redshift 最佳实践。
-
代码编译 – Amazon Redshift 为每个查询执行计划生成和编译代码。
编译代码执行更快,因为它消除了使用解释器的开销。但首次生成和编译代码通常会产生一些开销。因此,首次运行查询时的性能可能会造成误导。运行一次性查询时,这一开销可能会特别明显。再运行一次查询来确定其典型性能。Amazon Redshift 使用无服务器编译服务将查询编译扩展到 Amazon Redshift 集群的计算资源之外。编译的代码段本地缓存于集群中,且是在几乎无限的缓存中。集群重新启动后,此缓存将保持不变。相同查询的后续执行可以更快地运行,因为它们可以跳过编译阶段。
缓存在 Amazon Redshift 版本之间不兼容,因此,在版本升级后运行查询时会刷新编译缓存并重新编译代码。如果您的查询具有严格的 SLA,我们建议您预先运行查询分段,以扫描集群表中的数据。这样,Amazon Redshift 就可以缓存基表数据,从而缩短版本升级后查询的规划时间。通过使用可扩展的编译服务,Amazon Redshift 能够并行编译代码,以提供始终如一的快速性能。工作负载加速的幅度取决于查询的复杂性和并发性。