代码之家  ›  专栏  ›  技术社区  ›  Felipe Hoffa

BigQuery聚集表:在查询运行期间处理的字节不一致

  •  2
  • Felipe Hoffa  · 技术社区  · 6 年前

    对于同一查询的多个运行,处理的字节数是可变的(结果显著变化,从20GB变为30GB)。

    我在同一个表上运行同一个查询,得到相同的结果,多次查询运行,统计数据显示每次运行处理的字节数不同。

    这是预期的吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Felipe Hoffa    6 年前

    这是集群表的预期行为——一旦查询运行程序打开了足够多的集群以生成所需的结果,它将停止扫描,只对到目前为止扫描的字节收费。

    例如:

    SELECT * WHERE x=1 LIMIT 1
    

    如果X没有聚集,它会在找到第一个后停止,如果没有聚集,它会进行完整的表扫描。

    对同一表的实际查询:

    SELECT *, RAND()
    FROM `fh-bigquery.wikipedia_v3.pageviews_2017`
    WHERE datehour >= "2017-12-01"
    AND title LIKE '%hoffa%'
    LIMIT 1
    
    Query complete (2.1s elapsed, 111 MB processed)
    Query complete (1.8s elapsed, 126 MB processed)
    Query complete (1.9s elapsed, 114 MB processed)
    
    SELECT *, RAND()
    FROM `fh-bigquery.wikipedia_v3.pageviews_2017`
    WHERE datehour >= "2017-12-01"
    AND title LIKE '%khoffa%'
    LIMIT 1
    
    Query complete (2.9s elapsed, 2.52 GB processed)
    Query complete (3.0s elapsed, 1.19 GB processed)
    Query complete (1.9s elapsed, 114 MB processed)
    
    
    SELECT *, RAND()
    FROM `fh-bigquery.wikipedia_v3.pageviews_2017`
    WHERE datehour >= "2017-12-01"
    AND title LIKE '%fhoffa%'
    LIMIT 1
    
    Query complete (5.1s elapsed, 188 GB processed)
    Query complete (5.1s elapsed, 188 GB processed)
    Query complete (5.1s elapsed, 188 GB processed)
    
    • '%hoffa%' 扫描较少的数据,因为在打开的第一个集群上很有可能找到它。
    • '%khoffa%' 很难找到,因此有时需要打开许多集群——但您可能会幸运地在第一个集群上找到它。
    • '%fhoffa%' 如果不存在,那么bq必须打开每个集群,以防出现这种情况。
    • 我添加了 RAND() 以确保没有缓存。
    • BigWin:以前BigQuery对类似的查询收取188GB的费用,但现在在类似的情况下可以收取0.05%的费用。

    请注意,如果强制BigQuery扫描每个集群,那么它将返回到188GB。例如,如果你想找到顶部 %hoffa% (而不仅仅是第一个):

    SELECT *, RAND()
    FROM `fh-bigquery.wikipedia_v3.pageviews_2017`
    WHERE datehour >= "2017-12-01"
    AND title LIKE '%hoffa%'
    ORDER BY views DESC
    LIMIT 1
    
    Query complete (5.5s elapsed, 188 GB processed)
    

    了解有关群集表的优点的更多信息:

    推荐文章