Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

诊断查询

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

这些建议为您提供进行故障排除的起点。您还可以参阅以下资源了解更多详情。

连接失败

您的查询连接可能因以下原因失败;建议您采用以下故障排除方法。

客户端无法连接服务器

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

连接被拒绝

当您收到指示连接建立失败的错误消息时,通常是因为您没有访问群集的权限。有关更多信息,请参阅 Amazon Redshift Cluster Management Guide 中的连接被拒绝或失败

查询挂起

您的查询可能因以下原因而挂起或停止响应;建议您采用以下故障排除方法。

与数据库的连接中断

减小最大传输单位 (MTU) 的大小。MTU 大小确定可通过网络连接在单个以太网帧中传输的数据包的最大大小(以字节为单位)。有关更多信息,请参阅 Amazon Redshift Cluster Management Guide 中的与数据库的连接中断

与数据库的连接超时

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

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

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

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

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

可能存在死锁

如果可能存在死锁问题,请尝试以下操作:

查询耗时过长

您的查询可能因以下原因而耗时过长;建议您采用以下故障排除方法。

表未优化

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

查询写入到磁盘

至少有一部分查询执行存在写入磁盘的操作。有关更多信息,请参阅 提升查询性能

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

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

查询未优化

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

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

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

数据库需要运行 VACUUM 命令

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

加载失败

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

数据源在不同的区域

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

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

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

注意

如果群集和数据源位于不同的 AWS 区域,则会产生数据传输费用。此外,还会遇到更高的延迟和更多最终一致性问题。

COPY 命令失败

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

加载耗时过长

您的加载操作可能因以下原因而耗时过长;建议您采用以下故障排除方法。

COPY 从单个文件加载数据

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

加载操作使用多个 COPY 命令

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

加载数据不正确

您的 COPY 操作可能以下面的方式加载错误的数据;建议您采用以下故障排除方法。

只加载部分文件

在某些情况下,最终一致性可能导致使用 Amazon S3 ListBuckets 操作列出的文件与可用于 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 文档中的基于光标获取结果