最小化 Redshift 上使用的磁盘空间 Table

Minimizing Disk Spaced used on Redshift Table

我正在处理机器遥测数据,所以我有大量时间序列传感器读数用于流程的各种运行。我相信如果我以不同的方式存储数据可以节省一些磁盘使用量,但我是数据库优化和编码方面的新手。

我正在查看的一个 table 有约 116 亿行以下内容:

Column Type Encoding
Time (seconds since start of run) float8 none
Sensor reading float8 none
GUID of run varchar(256) lzo

我最初选择这些列类型是因为我不确定要输入的数据范围,但时间和传感器读数似乎在 (8,3) unsigned 和 (5,2) 时达到最大值) 分别签名,而最大 GUID 长度为 45。此处表示约 2.5M 唯一运行。

table 目前占用 ~260GB。我的计划是将浮点数转换为小数并减少 varchar 长度。这是正确的举动吗?是否有任何其他我应该关注的变化,即编码的变化?

tablespace可以通过多种方式回收。

首先是您正在查看的压缩(编码)。最好的建议是压缩所有内容,尤其是数据列。只有少数情况下,将原始数据存储在磁盘上是成功的(排序键——通常是第二个或第三个键)。 运行 分析压缩并获得关于哪种压缩最适合您的数据的报告。正如一位评论者指出的那样,代理整数可能是最好的,并且这是可以推荐的压缩(编码)模式之一。此报告还将让您了解可以节省多少 space。将数据类型从浮点数更改为某种十进制表示形式可能不会节省很多 space 一旦它们被压缩。我使用了最适合工作的数据类型,并将节省的 space 留给压缩。

其次,我想确保 table 中没有很多“死space”。 Redshift 使用 1MB 块来存储数据。一旦一个块被写入,它就不会更新,只会被替换。如果您有一个将数据增量添加到 table 的进程,则最后一个块可能已部分填满,但下一次写入将启动一个新块。这会导致在table中死了很多space。 “VACUUM”将压缩 table 以删除这个死的 space(如果您担心 table 的排序时间,或者“VACUUM DELETE ONLY”)。 Redshift 现在应该会自动执行此操作,但它可以被禁用,并且会在集群上的 activity 较低时发生,而对于某些集群来说永远不会。

另外要检查的是 table 是否分布良好,因为分布不佳会增加死机 space 并影响您的查询性能。

就是这样。 Redshift 就是关于打包大数据,但您需要很好地使用它的系统。