查询故障排除 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

查询故障排除

本节提供快速参考,帮助您识别和解决一些在使用 Amazon Redshift 查询时可能遇到的最常见问题和最严重问题。

这些建议为您提供进行故障排除的起点。您还可以参阅以下资源以获取更多详细信息。

连接失败

由于以下原因,您的查询连接可能会失败;我们建议您使用以下故障排除方法。

客户端无法连接到服务器

如果您使用了 SSL 或服务器证书,请在开始排查连接问题之前将其删除以降低复杂性。待您找到解决方案后,再重新添加 SSL 或服务器证书。有关更多信息,请转至《Amazon Redshift 管理指南》中的配置连接的安全选项

连接被拒绝

通常情况下,当您收到提示连接建立失败的错误消息时,意味着您没有访问集群的权限。有关更多信息,请转至《Amazon Redshift 管理指南》中的连接被拒绝或失败

查询挂起

由于以下原因,您的查询可能会挂起或停止响应;我们建议您使用以下故障排除方法。

到数据库的连接中断

减小最大传输单元 (MTU) 的大小。MTU 大小确定可通过网络连接在单个以太网帧中传输的数据包的最大大小(以字节为单位)。有关更多信息,请转至《Amazon Redshift 管理指南》中的至数据库的连接被删除

到数据库的连接超时

在运行 COPY 命令等较长的查询时,客户端到数据库的连接会挂起或超时。此时,您可能会发现,Amazon Redshift 控制台显示查询已完成,而客户端工具仍然显示正在运行查询。查询结果可能会丢失或不完整,具体取决于连接停止的时间。如果中间网络组件终止空闲连接,则会出现这种情况。有关更多信息,请转至《Amazon Redshift 管理指南》中的防火墙超时问题

ODBC 出现客户端内存不足错误

如果您的客户端应用程序使用 ODBC 连接,并且您的查询创建的结果集太大,无法存储到内存中,则可使用光标将结果集流式传输到客户端应用程序。有关更多信息,请参阅 DECLARE使用游标时的性能注意事项

JDBC 出现客户端内存不足错误

因此,尝试通过 JDBC 连接检索大型结果集时,可能会遇到客户端内存不足错误。有关更多信息,请参阅设置 JDBC 提取大小参数

可能存在死锁

如果存在潜在死锁,请尝试以下操作:

查询耗时过长

由于以下原因,您的查询可能需要太长时间;我们建议您使用以下故障排除方法。

表未优化

设置表的排序键、分配方式和压缩编码,以充分利用并行处理。有关更多信息,请参阅使用自动表优化

查询正在写入到磁盘

您的查询可能至少在部分查询执行中写入磁盘。有关更多信息,请参阅提高查询性能

查询必须等待其他查询完成

您可以通过创建查询队列并将不同类型的查询分配给适当的队列来提高整体系统性能。有关更多信息,请参阅实施工作负载管理

查询未优化

分析解释计划,找到重写查询或优化数据库的机会。有关更多信息,请参阅查询计划

查询需要更多内存才能运行

如果特定查询需要更多内容,您可以通过增大 wlm_query_slot_count 来增加可用内存。

数据库需要运行 VACUUM 命令

当添加、删除或修改大量行时,运行 VACUUM 命令,除非按排序键顺序加载数据。VACUUM 命令会重新组织您的数据,以维持排序顺序和还原性能。有关更多信息,请参阅对表执行 vacuum 操作

对长时间运行的查询进行故障排除的其他资源

以下是有助于优化查询的系统视图主题和其他文档部分:

  • STV_INFLIGHT 系统视图显示集群上正在运行哪些查询。将它与 STV_RECENTS 一起使用有助于确定哪些查询当前正在运行或最近已完成。

  • SYS_QUERY_HISTORY 对故障排除很有用。它可显示 DDL 和 DML 查询的相关属性,例如它们的当前状态(如 runningfailed)、每个查询运行所花的时间,以及查询是否在并发扩展集群上运行。

  • STL_QUERYTEXT 捕获 SQL 命令的查询文本。此外,SVV_QUERY_INFLIGHT(可将 STL_QUERYTEXT 联接到 STV_INFLIGHT)显示了更多的查询元数据。

  • 事务锁定冲突可能是查询性能问题的根源。有关当前持有表锁的事务的信息,请参阅SVV_TRANSACTIONS

  • 确定最适合优化的查询提供了一个故障排除查询,可帮助您确定最近运行的哪些查询最耗时。这可以帮助您将精力集中在需要改进的查询上。

  • 如果您想进一步探索查询管理并了解如何管理查询队列,实施工作负载管理显示了如何实现。工作负载管理是一项高级功能,在大多数情况下,我们建议使用自动工作负载管理。

加载失败

您的数据加载可能会因以下原因而失败;我们建议您使用以下故障排除方法。

数据源在不同的 Amazon 区域

预设情况下,COPY 命令中指定的 Amazon S3 桶或 Amazon DynamoDB 表必须位于集群所在的 Amazon 区域。如果您的数据和集群位于不同的区域,您将收到如下所示的错误消息:

The bucket you are attempting to access must be addressed using the specified endpoint.

尽量确保集群和数据源位于同一区域。您可以通过在 COPY 命令中使用 REGION 选项来指定其他区域。

注意

如果集群和数据源位于不同的 Amazon 区域,则会产生数据传输费用。此外,您还会经历更高的延迟。

COPY 命令失败

查询 STL_LOAD_ERRORS 以发现在特定加载期间发生的错误。有关更多信息,请参阅STL_LOAD_ERRORS

加载耗时过长

由于以下原因,加载操作可能需要太长时间;我们建议采用以下故障排除方法。

COPY 从单个文件中加载数据

将加载数据拆分为多个文件。如果从一个大型文件加载所有数据,Amazon Redshift 必须执行序列化加载,这样速度很慢。文件数应为集群中切片数量的倍数,且文件大小应大致相同,压缩后介于 1 MB 和 1 GB 之间。有关更多信息,请参阅设计查询的 Amazon Redshift 最佳实践

加载操作使用多个 COPY 命令

如果您使用多个并发 COPY 命令从多个文件加载一个表,会强制 Amazon Redshift 执行序列化加载,这样速度慢得多。在这种情况下,请使用单个 COPY 命令。

加载数据不正确

您的 COPY 操作可以通过以下方式加载不正确的数据;我们建议使用以下故障排除方法。

加载错误的文件

使用对象前缀指定数据文件可能会导致读取不需要的文件。因此,请使用清单文件准确指定要加载的文件。有关更多信息,请参阅 COPY 命令中的 copy_from_s3_manifest_file 选项和 COPY 示例中的 Example: COPY from Amazon S3 using a manifest

设置 JDBC 提取大小参数

预设情况下,JDBC 驱动程序一次收集查询的所有结果。因此,尝试通过 JDBC 连接检索大型结果集时,可能遇到客户端内存不足错误。为使您的客户端按批检索结果集,而不是在单个“要么全部检索,要么失败”提取中检索结果集,请在客户端应用程序中设置 JDBC 提取大小参数。

注意

ODBC 不支持提取大小。

为获得最佳性能,请将提取大小设置为不会导致内存不足错误的最大值。较小的提取大小值会导致更多的服务器通信,从而延长执行时间。服务器会预留资源,包括 WLM 查询槽和关联内存,直到客户端检索到整个结果集或查询取消为止。如果适当优化提取大小,则可以更快释放这些资源,使其能够供其他查询使用。

注意

如果需要提取大型数据集,建议使用 UNLOAD 语句将数据传输到 Amazon S3。使用 UNLOAD 时,计算节点并行工作,以加快数据的传输。

有关设置 JDBC 提取大小参数的更多信息,请参阅 PostgreSQL 文档中的基于光标获取结果