在 BigQuery 中具有指定精度/小数位数的数值是否更高效

问题描述 投票:0回答:1

我发现很多时候我只需要 int32 甚至 int16,但 BigQuery 不支持除 Int64 之外的任何 INT 变体(尽管有别名使其看起来支持 SmallInt 之类的东西)。

我想知道是否有人知道使用比例设置为 0 且精度设置为 10 的数字来表示 i32 值是否会在存储和/或计算成本方面更有效。我不确定 BQ 是否有效地利用了比例/精度参数,但我不确定如果他们不打算利用它们来最大化存储效率,为什么他们会提供它们。

查看了谷歌文档,我找不到任何关于优化表模式的内容,只是优化查询。如果您有任何指向最有效模式的可靠文档,请分享!

performance google-bigquery numeric
1个回答
0
投票

只要不使用固定槽,计算成本仅取决于查询存储中的数据量。因此,有效存储数据是一个好主意。

最小的数值是int64。所有其他数字格式都需要更多空间。对于数字数据类型, “应用精度和小数位数限制不会影响基础数据类型的存储大小。”

但是,如果使用无符号 int32 值,可以更有效地将它们保存在字符串中。 int16 的最大值是 65.536,该字符串的长度为 5 个字节。添加两个字节来编码字符串长度,最终我们得到 7 个字节的一个条目。比 int64 数据类型少一个字节。

当然,两个无符号 int32 值(或四个 int16)可以通过

a*65536+b
转换为一个 int64。然而,没有人会再理解表中的这些数据了。

为了详细了解存储,我们生成一个具有几列的虚拟表:

CREATE OR REPLACE TABLE
  Test.aaa AS
SELECT
  "65000" AS str,
  65000 AS val,
  x,
  CAST(64000 AS numeric ) AS num,
  CAST(64000 AS BIGNUMERIC ) AS bignum,
FROM
  UNNEST(GENERATE_ARRAY(1,10000)) x

为每列构建查询

SELECT
  bignum
FROM
  `Test.aaa`

向我们显示该列中的存储数据量。

专栏 数据类型 数据类型大小 查询金额
str 绳子 7 68.36 kB
瓦尔 int64 8 78.13 kB
x int64 8 78.13 kB
数字 数字 16 156.25 kB
bignum bignum 32 312.5 kB

由于表有 10.000 行,因此数据类型大小乘以 10.000 除以 1024 即可得出查询量。

© www.soinside.com 2019 - 2024. All rights reserved.