简单的几个操作,降低 BigQuery 大笔的存储费用!(理想情境中可以节省九成左右)

BigQuery 的表格存储一直以来都有很多项计费的模式,而主要分成两个维度:

  • Long-term & Active:长期未更新(90天)的资料会进入 Long-term,有较低的价格。
  • Logical & Physical:不同的储存模式,Logical 计费基于未压缩的大小,而 Physical 则是压缩后来计价,因此虽然 Physical 单位价格高两倍,但若压缩比超过 2:1,则能节省存储成本,也是今天想讨论的重点。
  • Long-term & Active 的区别,可以展现在 Partition table 中,这种分割表,会依照你定义的分区单位(日、月、年等,我们通常使用日为分区单位)去将资料表存成小张的表,可以让早于 90 天前的资料小表转为 Long-term 表,降低成本。

    这份官方文件有蛮清楚的说明,讲述如何检测在你的资料仓储中转换是否能降低成本、降低多少。

    文件中的范例提到他的压缩比大约是 16~25:1,是如何做到这么高的压缩比的?

    详细的技术细节他应该是不会公开,不过有几个蛮有趣的点可以分享:

    BigQuery 採用 column-based 的方式进行存储,因此同个 column 的资料重复性越高,会有越高的压缩比,也许有几种不同的实现方法,但概念类似。

    例如,连续数据 [100, 101, 102] 可压缩为 [100, +1, +1]。或是,文字资料採用代码来表示,把县市转换为数字来储存之类的方法。

    除了有趣之外,知道这些之后,有什么可以做的呢?不要 Typo!意外发现 Typo 可不单纯只是影响分析,而还会影响存储压缩比,责任重大啊!除了避免之外,就是要做好 Monitoring 跟 Testing,来在事后做监控与修正。

    另,time travel 功能在计费上会有影响,是上述方法没有办法直接计算出来的,毕竟 time travel 储存的变动资料是一个变数,无法计算而得。可以运用 INFORMATION_SCHEMA.TABLE_STORAGE 中的 TIME_TRAVEL_PHYSICAL_BYTES 跟 FAIL_SAFE_PHYSICAL_BYTES,以现在的水平去推算可能产生的额外成本。

    参考官方文件),通常 time travel 预设为 7 天,允许使用者访问过去 7 天的资料版本。文件提到 Physical 储存模式会额外收费,意思是若这七天有变动的资料,会有额外的 active storage 费用,而 logical 模式依照未压缩的资料大小来计费,time travel 的部分已经包含在内,不会另外收费。若要再更节省、且没有回溯的需求,可以考虑将 time travel 的期间缩短,否则频繁修改的大资料集也会产生不少非预期成本。

    如何转换?

    转换以资料集为单位进行,只需要在资料集的 Advanced options 中调整 Storage Billing Model 的设定即可。

    并且,这项转换是不会影响到查询效能跟计费的(On-demand compute),不用担心。