我发现很多时候我只需要 int32 甚至 int16,但 BigQuery 不支持除 Int64 之外的任何 INT 变体(尽管有别名使其看起来支持 SmallInt 之类的东西)。
我想知道是否有人知道使用比例设置为 0 且精度设置为 10 的数字来表示 i32 值是否会在存储和/或计算成本方面更有效。我不确定 BQ 是否有效地利用了比例/精度参数,但我不确定如果他们不打算利用它们来最大化存储效率,为什么他们会提供它们。
查看了谷歌文档,我找不到任何关于优化表模式的内容,只是优化查询。如果您有任何指向最有效模式的可靠文档,请分享!
只要不使用固定槽,计算成本仅取决于查询存储中的数据量。因此,有效存储数据是一个好主意。
最小的数值是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 即可得出查询量。