【问题标题】:How do you explain the difference in performance of these two queries?您如何解释这两个查询的性能差异?
【发布时间】:2021-11-26 16:12:51
【问题描述】:

我有以下两个查询:

WITH
  T AS(
  SELECT
    ROW_NUMBER() OVER() AS uid,
    position_geom
  FROM
    `bigquery-public-data.catalonian_mobile_coverage.mobile_data_2015_2017`
  WHERE
    date > "2017-12-26" )
SELECT
  T1.uid,
  T2.uid,
  ST_DISTANCE(T1.position_geom, T2.position_geom) distance
FROM
  T AS T1,
  T AS T2
WHERE
  T1.uid <> T2.uid QUALIFY ROW_NUMBER() OVER (PARTITION BY T1.uid ORDER BY ST_DISTANCE(T1.position_geom, T2.position_geom)) < 101
ORDER BY
  T1.uid,
  ST_DISTANCE(T1.position_geom, T2.position_geom)

WITH
  T AS(
  SELECT
    ROW_NUMBER() OVER() AS uid,
    position_geom
  FROM
    `bigquery-public-data.catalonian_mobile_coverage.mobile_data_2015_2017`
  WHERE
    date > "2017-12-26" ),
  T2 AS(
  SELECT
    T1.position_geom pointA,
    T1.uid uidA,
    T2.position_geom pointB,
    T2.uid uidB,
    ST_DISTANCE(T1.position_geom, T2.position_geom) distance
  FROM
    T AS T1,
    T AS T2 )
SELECT
  uidA,
  uidB,
  distance
FROM
  T2
WHERE
  uidA <> uidB QUALIFY ROW_NUMBER() OVER (PARTITION BY uidA ORDER BY distance) < 101
ORDER BY
  uidA,
  distance

两个查询都给出了相同的结果,但第二个查询的速度几乎快了两倍(就经过的时间和消耗的槽时间而言)。为什么 bigquery 没有对第一个查询进行内部优化?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您可以在execution details 中查看查询阶段的处理方式。第一个查询是把t1表和t2表join后,读取你选择的所有数据,然后排序很快,因为数据已经在临时表中了,所以这使得整个排序过程更快,但是当正在读取数据,这会使查询执行速度变慢。

    第二个查询更快,因为它在您进行排序过程时读取数据。这意味着排序过程比第一次查询要慢,但是您没有读取数据的重新分区过程,这使得查询执行速度更快。

    这里,区别在于查询的编写方式,因为在第二个中,给您一个子查询来分配查询的工作方式,并且当您读取它时,它会更快,因为只有一个读取过程,这使得这消耗更少的时隙。

    【讨论】:

    • 不确定我是否理解您的解释,这是否意味着每次在查询中多次使用计算变量时,我都应该创建子查询?这不应该由 Bigquery 在内部完成吗?
    • 有时最好创建子查询,因为这些子查询的执行只在一个进程中完成,同时当您执行查询时,它必须逐步完成。但通常最好对计算变量使用子查询。对于第二个问题,它取决于查询中使用的逻辑,BigQuery 会遵循您在执行查询时提供的信息。
    【解决方案2】:

    为了给出一些提示,你需要精确一些元素:

    1. 您使用的是哪个数据库
    2. 定义了哪些索引
    3. bigquery-public-data.catalonian_mobile_coverage.mobile_data_2015_2017 中的行数
    4. 您是直接查询数据库还是通过连接器?

    根据行数,您的数据库引擎可能不使用索引。 每个数据库通常都有一组有助于分析查询的工具。

    mysql(也适用于 MariaDB)例如提供关键字 EXPLAINANALIZE TABLE 如果你有企业版,可以访问Mysql查询分析

    SQLServer提供SQL server query analyzer

    ...

    【讨论】:

    • 那是专门的 BigQuery 问题! :o)
    猜你喜欢
    • 2013-04-29
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多