为什么这 2 个查询具有相同的 "GB processed"(因此成本)?

Why do these 2 queries have the same "GB processed" (and thus cost)?

我的测试数据包含 27,768,767 行。我的架构包括一个 "message" 字符串类型的列。这些字符串的长度各不相同,但通常为几百个字符。还有 user_id 类型的列。这是两个 return 0 行的查询(where 子句在我的数据中不匹配)。然而,令我惊讶的是,他们都报告已处理 4.69 GB。

SELECT * FROM logtesting.logs WHERE user_id=1;

Query complete (1.7s elapsed, 4.69 GB processed)

.

SELECT * FROM logtesting.logs WHERE message CONTAINS 'this string never appears';

Query complete (2.1s elapsed, 4.69 GB processed)

由于 int 存储在 8 bytes 中,我预计在前一个 (user_id) 查询中处理的数据大约为 213MB(2800 万行 * 每个 [= 8 字节) 24=]).后一个(消息)查询更难估计,因为字符串的长度不同,但我希望它比前一个(user_id)查询大几倍。

我对how BigQuery calculates query costs的理解有误吗?

无论您做什么,BigQuery 都需要扫描您的 table 中的所有行(尽管不一定是所有列),所以您得到这个是正常的,因为您的 table 不变。 where 子句仅表示它不会 RETURN 数据。它仍然需要处理它。

确保降低处理速度的唯一方法是不要 select 所有列。 BigQuery 是基于列的,因此如果您不需要所有属性,请不要 return 全部(这也意味着它们不会被处理)。这将有助于降低您的成本:)

从历史上看,"select *" 不受支持,以确保人们不会通过困难的方式发现它