Redshift 维护

Maintenance on Redshift

我发现自己在处理一个包含 2 种不同类型表的 Redshift 集群:每天完全替换的表和每天接收合并的表。

据我目前的了解,应该给出维护命令,因为所有这些表都有数百万行。到目前为止我发现的 3 个命令是:

vacuum table_name;
vacuum reindex table_name;
analyze table_name;

在什么情况下应该应用这些命令中的哪一个?我计划在他们半夜加载后每天都这样做。每天这样做的原因是因为在手动 运行 之后,性能有了巨大的提高。

看了文档,感觉不是很清楚标准流程应该是什么。

谢谢!

编辑:无论加载类型如何,所有表都有交错排序键。

命令的快速摘要,来自 VACUUM documentation:

  • VACUUM:对指定的table(或当前数据库中的所有table)进行排序,并回收被标记为删除的行所占用的磁盘space以前的 UPDATE 和 DELETE 操作。完全真空不会为交错 tables 执行重新索引。
  • VACUUM REINDEX:分析交错排序键列中值的分布,然后执行完整的 VACUUM 操作。
  • ANALYZE:更新 table 供查询规划器使用的统计信息。

当大量数据已加载到 table 中时, 执行 ANALYZE 是一种很好的做法。事实上,如果不到 10% 的数据发生变化,Amazon Redshift 会自动跳过分析,因此 运行 ANALYZE.

没有什么危害

您提到一些 table 每天都被完全替换 。这应该通过删除并重新创建 table 或使用 TRUNCATE 来完成。用 DELETE * 清空 table 效率较低,不应用于清空 table.

VACUUM 可能需要很长时间。在数据按时间顺序附加并且table的SORTKEY基于时间的情况下,没有必要清理table。这是因为 table 已经有效排序。但是,这不适用于交错排序。

交错排序更棘手。来自 sort key documentation:

An interleaved sort key gives equal weight to each column in the sort key, so query predicates can use any subset of the columns that make up the sort key, in any order.

基本上,交错排序使用一种奇特的算法对数据进行排序,因此基于任何列(单独或组合)的查询将最大限度地减少需要从磁盘读取的数据块的数量。磁盘访问总是在数据库中花费最多的时间,因此最小化磁盘访问是加速数据库的最佳方法。 Amazon Redshift 使用 Zone Maps 来识别要从磁盘读取哪些块,并且最小化此类访问的最佳方法是对数据进行排序,然后在执行查询时跳过尽可能多的块

交错排序的性能不如普通排序,但好处是多个字段的排序相当好。 如果您经常查询许多不同的字段,则仅使用交错排序。维护交错排序(通过 VACUUM REINDEX)的开销相当高,只有在重建索引工作时才应这样做值得这个结果。

所以,总结一下:

  • ANALYZE 重大数据更改后
  • VACUUM 如果您从 table
  • 中定期删除数据
  • VACUUM REINDEX 如果您使用交错排序并且大量数据已更改