我发现自己正在处理一个包含2种不同类型表的Redshift集群:每天完全替换的表和每天都会收到合并的表。
据我所知,到目前为止,应该提供维护命令,因为所有这些表都有数百万行。到目前为止我发现的3个命令是:
vacuum table_name;
vacuum reindex table_name;
analyze table_name;
应该在哪种情况下应用哪些命令?我计划在他们半夜加载后每天做这件事。每天这样做的原因是因为在手动运行其中一些之后,性能会有很大提升。
阅读完文档后,我觉得标准程序应该是什么不太清楚。
谢谢!
编辑:无论负载类型如何,所有表都有交错排序键。
答案 0 :(得分:2)
VACUUM
:对指定的表(或当前数据库中的所有表)进行排序,并回收由先前的UPDATE和DELETE操作标记为删除的行占用的磁盘空间。完全真空不会对交错表执行重新索引。VACUUM REINDEX
:分析交错排序键列中值的分布,然后执行完整的VACUUM操作。ANALYZE
:更新表统计信息以供查询计划程序使用。优良作法是在将大量数据加载到表格中时执行ANALYZE
。事实上,如果不到10%的数据发生变化,Amazon Redshift将自动跳过分析,因此运行ANALYZE
几乎没有什么害处。
你提到一些表每天都被完全替换。这应该通过删除和重新创建表,或使用TRUNCATE
来完成。使用DELETE *
清空表的效率较低,不应用于清空表。
VACUUM
可能需要很长时间。如果数据按时间顺序附加且表格SORTKEY
基于时间,则无需对表格进行抽真空。这是因为表已经有效地排序了。但是,这不适用于交错排序。
交错排序更棘手。来自sort key documentation:
交错排序键为排序键中的每一列提供相同的权重,因此查询谓词可以按任何顺序使用构成排序键的列的任何子集。
基本上,交错排序使用精确算法对数据进行排序,以便基于任何列(单独或组合)的查询将最小化需要从磁盘读取的数据块的数量。磁盘访问总是占用数据库中的最多时间,因此最小化磁盘访问是加速数据库的最佳方式。 Amazon Redshift使用区域映射来识别要从磁盘读取的块,并且最小化此类访问的最佳方法是对数据进行排序,然后在执行查询时跳过尽可能多的块。
Interleaved排序的性能低于普通排序,但是可以提供多个字段排序相当好的好处。 如果您经常在许多不同的字段上进行查询,则仅使用交错排序。维护交错排序(通过VACUUM REINDEX
)的开销非常高,只有在重新索引工作值得的情况下才能完成结果
所以,总结一下:
ANALYZE
VACUUM
VACUUM REINDEX
如果您使用Interleaved Sorts并且大量数据已更改