【问题标题】:Maintenance on RedshiftRedshift 的维护
【发布时间】:2017-04-22 14:52:44
【问题描述】:

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

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

vacuum table_name;
vacuum reindex table_name;
analyze table_name;

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

阅读文档后,我感觉不是很清楚标准程序应该是什么。

谢谢!

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

【问题讨论】:

    标签: database amazon-redshift database-administration maintenance


    【解决方案1】:

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

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

    当大量数据加载到表中时,执行ANALYZE 是一种很好的做法。事实上,如果少于 10% 的数据发生变化,Amazon Redshift 会自动跳过分析,因此运行ANALYZE 几乎没有什么坏处。

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

    VACUUM 可能需要很长时间。在数据按时间顺序追加且表的SORTKEY 基于时间的情况下,无需对表进行真空处理。这是因为表格已经有效排序。但是,这不适用于交错排序。

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

    交错排序键对排序键中的每一列赋予相同的权重,因此查询谓词可以以任何顺序使用构成排序键的列的任何子集。

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

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

    所以,总结一下:

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

    【讨论】:

    • 我为此找到了最好的解释。幸运的是,被替换的表确实使用了截断。从它的外观来看,我将不得不做很多真空重新索引。如果您也知道答案,实际上最终会出现在这个问题中:stackoverflow.com/questions/43594310/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2017-02-12
    • 2012-10-03
    • 2010-10-04
    • 2023-03-30
    相关资源
    最近更新 更多