您如何解释这两个查询的性能差异?

Posted

技术标签:

【中文标题】您如何解释这两个查询的性能差异?【英文标题】: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 没有对第一个查询进行内部优化?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

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

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

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

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

SQLServer提供SQL server query analyzer

...

【讨论】:

那是专门的 BigQuery 问题! :o)

以上是关于您如何解释这两个查询的性能差异?的主要内容,如果未能解决你的问题,请参考以下文章

为啥两个查询之间的性能差异?

两个sql查询的性能差异?

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

如何使用休眠查询语言查找两个时间戳之间的差异

mongoDB中提到的两个查询之间的差异

SQLITE查询速度很慢是啥原因呢,两个语句差异明显,请高人解释