确保受影响的表具有较低的统计关闭百分比。这对于确保查询规划器为查询分配正确的内存量非常重要。我们在Amazon Redshift 的 14 大性能调优技术文章中更详细地讨论了这个主题。您还可以通过我们的 Table API 自动清理和排序表。
在 Integrate.io 仪表板中,查看单个查询的建议将显示确切接触的表以及如何更新它们,以及查询使用的内存量和 WLM 队列中的内存容量。
基于磁盘的查询
中间存储
Redshift 还将每个节点中的磁盘用于另一种称为“中间存储”的临时查询数据,从概念上讲,这与基于磁盘的查询超出其内存分配时使用的临时存储无关。
当 Redshift 将中间操作的结果保存到磁盘以用作未来操作的输入时,将使用中间存储。如果您的查询在查询操作之间存储了大量数据,那么中间存储就变得非常重要,因为该存储可能会导致您的集群耗尽磁盘空间。它还会引入额外的 I/O,从而导致执行时间变慢。
限制使用的中间存储量的方法。
由于中间存储用于将结果从查询执行的一个部分传送到另一个部分,因此减少中间存储的最佳方法是在查询的中间步骤(子查询、CTE 等)上使用谓词(例如 WHERE 子句、JOIN ... ON 子句等)以确保您不会在查询处理过程中携带不必要的数据。
例如,考虑这个连接两个 CTE 的结果的查询:
我们有一项很棒的新功能,称为“查询建议”,它可以主动让您知道您的查询是否使用了大量中间存储。
查询建议
在诊断集群存储利用率峰值时,此值很重要。
例如,假设您发现集群存储量在一段时间内激增,但传输到 约旦电话数据 集群的数据量(通过COPY命令)却没有相应增加。您可以搜索所有具有较大“内存到磁盘”值的查询,以确定哪些查询导致集群磁盘空间不足。
这是一个真实的例子。下图显示了集群在 2 周内使用的实际磁盘空间,按架构细分。此特定图表显示了随时间推移一致的存储利用率,变化很小。
架构大小,基于磁盘的查询
磁盘利用率百分比图表则讲述了不同的故事。在同一集群上,在同一时间段内,磁盘利用率经常达到 100%。这是由于某些查询使用了大量的中间存储造成的。
磁盘利用率
我们最近发布的Cluster Recommendations 的一项很酷的功能是立即显示磁盘利用率高的查询。对于此集群,查询似乎使用了接近 2 TB 的磁盘空间来获取中间结果!
聚类建议
结论
监控“基于磁盘的查询”和“中间存储”对于保持集群健康至关重要。 掌握临时磁盘利用率可防止 Amazon Redshift 磁盘因查询不当而填满,从而导致查询被终止和用户中断。