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