【问题标题】:GCP BigQuery - LIMIT but full table read - How to limit queried data to a minimumGCP BigQuery - LIMIT but full table read - 如何将查询的数据限制在最低限度
【发布时间】:2021-02-22 05:18:25
【问题描述】:

看起来LIMIT 对处理/查询的数据量没有影响(如果您信任 UI)。



SELECT
  * --count(*)
FROM
  `bigquery-public-data.github_repos.commits`
-- LIMIT   20

如何将查询的数据量限制在最低限度(即使可能总是需要一个完整的分区)

  • 不使用“预览”或类似名称
  • 不知道数据的分区/聚类

如何在查询执行前检查实际的大概金额?


在执行细节中声明只有 163514 行作为输入被查询(不是 244928379 行)

【问题讨论】:

  • 不清楚你想要实现什么。您有分区和集群来限制数据扫描量,但在任何情况下,它总是执行一次完整扫描(在表上、分区上......)。限制只限制输出,不限制处理。那么,说不知道分区能不能再清楚一点?你要数数吗?全选 (*)?
  • "Limit 2" -> 提供了很多可能性。就像从缓存中获取最后两个条目(由于当前的写入或读取时间或者因为它经常使用,可能会被缓存。模拟概念存在于例如 cassandra .. -> 目标是最小化读取/成本并最大化性能。场景是您不了解分区和集群。
  • @guillaumeblaquiere 就像屏幕截图所示,如果你说它是全表扫描,那你就错了。就像我写的那样不是全表扫描。
  • 我回答了更多细节和例子。但我不确定我是否正在解决您的问题。你能说得更准确点吗?

标签: sql google-cloud-platform google-bigquery sql-execution-plan


【解决方案1】:

您为工作器中加载的数据量付费。当然,您在请求中什么也不做,您要求第 20 个结果,查询更早停止,并且所有数据都没有被处理,但至少已加载。你会为此付出代价的!​​p>

看看这个。我有类似的要求

现在,让我们看看日志

计费的总字节数约为 800Mb

因此,当您使用 BigQuery 时,您必须有不同的想法,它是分析数据库,并非旨在执行小请求(启动速度太慢,由于工作线程预热,延迟至少为 500 毫秒)。 em>


我的表包含 3M+ 行,只有 10% 已被处理

并且您支付预留和加载成本(移动数据有成本,预留槽也有成本)。

这就是为什么在 Google BigQuery 上省钱的许多小窍门。 Some examples by a former BigQuery Dev Advocate

【讨论】:

  • 感谢您的回答。问题的核心是,在执行细节中指出只有 0.067% 的行(244928379/163514)被读取。这不是全表扫描,但 794 GB 似乎是全表大小。你的情况也是这样吗? -> 为(读取)244928379 行但仅读取 0.067% 的行收费会很疯狂,不是吗?
  • 是的,这是他们的定价模式。另一方面,您可以以相同的成本在相同数量的数据上实现非常复杂的公式和过滤、连接 (...)。因此,请使用 BigQuery 转换和深入研究您的数据,而不是执行通常的“MySQL”查询!
【解决方案2】:

如果您想限制 BQ 用于查询的数据量,您有以下两种选择:

  • 表分区 大查询可以使用您提供的日期/日期时间/时间戳列按插入日期对数据进行分区(如果您对表进行定期更新,这很好)。 p>

    为此,您必须在 DDL 中指定分区策略:

    CREATE TABLE mydataset.mytable (foo: int64, txdate:date)
    PARTITION BY txdate
    
  • 通配符表(如 Sharding - 将数据拆分为多个表

    当您的数据包含有关不同域(地理、客户类型等)或来源的信息时,此方法有效。 您可以使用类似的模式(通常人们使用相同的模式)创建像这样的“子表”或“分片”,而不是拥有一张大表。例如,dateset.tablename.eur 用于欧洲数据,```dataset.tablename.jap`` 用于日本数据。

    您可以直接查询其中一个表select col1,col2... from dataset.tablename.custromer_eur; 或从所有表select col1,col2 from 'dataset.tablename.*' 中查询

    通配符表也可以按日期分区。

【讨论】:

  • 感谢您的信息。关于完整表大小/行和“执行详细信息”(实际上[仅])的不匹配,通配符表仍然存在读取行,对吗?
【解决方案3】:

截至 2021 年 12 月,我注意到 select * from Limit,不会扫描整个表,您只需为少量行付费,显然如果您添加 order by,它将扫描所有内容。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2018-05-25
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多