Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

提升查询性能

下面是一些影响查询性能的常见问题,以及诊断和解决它们的方法。

表统计数据缺失或过时

如果表统计数据缺失或过时,您可能会看到以下内容:

  • EXPLAIN 命令结果中存在警告消息。

  • STL_ALERT_EVENT_LOG 中存在缺失统计数据提醒事件。有关更多信息,请参阅 查看查询提醒

要修复这一问题,请运行 ANALYZE

嵌套循环

如果存在嵌套循环,您可能会在 STL_ALERT_EVENT_LOG 中看到嵌套循环提醒事件。此外,您还可以通过运行发现具有嵌套循环的查询中的查询来识别此类事件。有关更多信息,请参阅 查看查询提醒

要修复这一问题,请检查查询是否存在交叉联接,尽量将其删除。交叉联接是无联接条件的联接,它会导致对两个表执行笛卡尔积操作。它们通常作为嵌套循环联接执行,这是最慢的可能联接类型。

哈希联接

如果存在哈希联接,则可能出现以下内容:

要修复这一问题,您可以采取以下几种方法:

  • 重写查询,尽可能使用合并联接。为此,您可以指定既是分配键又是排序键的联接列。

  • 如果 SVL_QUERY_SUMMARY 中 HJOIN 步骤的行数字段值较查询中最终 RETURN 步骤中的行数值大得多,请确认您能否重写查询以基于唯一的列进行联接。当查询不基于唯一的列(如主键)进行联接时,会增加联接操作涉及的行数。

虚影行或未提交的行

如果存在虚影行或未提交的行,则 STL_ALERT_EVENT_LOG 中可能出现指示过多虚影行的提醒事件。有关更多信息,请参阅 查看查询提醒

要修复这一问题,您可以采取以下几种方法:

  • 查看 Amazon Redshift 控制台的 Loads 选项卡有没有针对任意查询表的活动加载操作。如果您发现有处于活动状态的加载操作,请等待这些操作完成,然后再执行操作。

  • 如果没有处于活动状态的加载操作,则对查询表运行 VACUUM,移除已删除的行。

未排序或排序错乱的行

如果存在未排序或排序错乱的行,则 STL_ALERT_EVENT_LOG 中可能出现非常具有选择性的筛选条件提醒事件。有关更多信息,请参阅 查看查询提醒

您也可以运行发现具有数据偏斜或未排序行的表中的查询以检查查询中的任意表是否包含大片未排序的区域。

要修复这一问题,您可以采取以下几种方法:

  • 对查询表运行 VACUUM 以重新排序行。

  • 检查查询表的排序键,看看有无可以改进之处。在进行任何更改之前,请务必权衡查询的性能及其他重要查询和系统的整体性能。有关更多信息,请参阅 选择排序键

非最优数据分配

如果数据分配不够理想,则可能出现以下内容:

  • STL_ALERT_EVENT_LOG 中存在顺序执行、大型广播或大型分配提醒事件。有关更多信息,请参阅 查看查询提醒

  • 对于给定步骤,处理的切片数与行数相差较大。有关更多信息,请参阅 使用 SVL_QUERY_REPORT 视图

  • 对于给定步骤,切片的处理时间相差较大。有关更多信息,请参阅 使用 SVL_QUERY_REPORT 视图

如果上述条件均未满足,您还可以查看查询中是否有任意表存在数据偏斜(运行发现具有数据偏斜或未排序行的表中的查询)。

要修复这一问题,请查看查询中表的分配方式,看看有无任何可以改进之处。在进行任何更改之前,请务必权衡查询的性能及其他重要查询和系统的整体性能。有关更多信息,请参阅 选择数据分配方式

分配给查询的内存不足

如果分配给查询的内存不足,SVL_QUERY_SUMMARY 中可能出现 is_diskbased 值为 true 的步骤。有关更多信息,请参阅 使用 SVL_QUERY_SUMMARY 视图

要修复这一问题,请临时增加查询使用的查询槽的数目,以向其分配更多的内存。工作负载管理 (WLM) 在查询队列中预留与为查询设置的并发级别相等的槽数。例如,并发级别为 5 的队列拥有 5 个槽。分配给队列的内存平均分配到每个槽。将多个槽分配给一个查询可使该查询访问所有这些槽的内存。有关如何临时增加查询槽数的更多信息,请参阅 wlm_query_slot_count

非最优 WHERE 子句

如果 WHERE 子句导致过多表扫描,则段中可能出现一个 SCAN 步骤,其 maxtime 值在 SVL_QUERY_SUMMARY 中最大。有关更多信息,请参阅 使用 SVL_QUERY_SUMMARY 视图

要修复这一问题,请根据最大的表的主排序列向查询添加 WHERE 子句。这种方法有助于尽量减少扫描时间。有关更多信息,请参阅 设计表的最佳实践

限制性谓词不足

如果查询的限制性谓词不足,则段中可能出现一个 SCAN 步骤,其 maxtime 值在 SVL_QUERY_SUMMARY 中最大,其 rows 值较查询最终 RETURN 步骤中的 rows 值大得多。有关更多信息,请参阅 使用 SVL_QUERY_SUMMARY 视图

要修复这一问题,请尝试向查询中添加谓词,或加强现有谓词的限制性,以缩小输出范围。

极大结果集

如果查询返回极大结果集,请考虑重写查询,使用 UNLOAD 将结果写入 Amazon S3。这种方法可充分利用并行处理的优势,从而提高 RETURN 步骤的性能。有关检查极大结果集的更多信息,请参阅使用 SVL_QUERY_SUMMARY 视图

大型 SELECT 列表

如果查询的 SELECT 列表极大,则在 SVL_QUERY_SUMMARY 中,可能出现相对于任意步骤(与其他步骤相比)的 rows 值都大的 bytes 值。bytes 值较大说明您选择了大量列。有关更多信息,请参阅 使用 SVL_QUERY_SUMMARY 视图

要修复这一问题,请检查选择的列,看看能否删除某些列。