【问题标题】:Query optimization by reusing the inner query only once通过仅重用一次内部查询来优化查询
【发布时间】:2020-10-05 16:25:28
【问题描述】:

考虑下面的查询

SELECT
  FlightDate,
  FlightNum,
  Origin,
  Dest,
  AirlineID
FROM
  ontime1
WHERE 
  FlightDate >= (SELECT MIN(FlightDate) FROM ontime2 WHERE Origin='JFK') AND
  FlightDate <= (SELECT MAX(FlightDate) FROM ontime2 WHERE Origin='JFK') AND
  AirlineID IN (SELECT AirlineID FROM ontime2 WHERE Origin='JFK')
LIMIT 10;

ontime1 -> 根据 FlightDate 编制索引
ontime2 -> 基于 Origin、Dest 索引

由于表数据太大,连接表也不是最佳的

如何重复使用内部查询而无需一次又一次地重复相同的查询?

【问题讨论】:

  • 是mysql还是clickhouse?
  • @simPod 它的 clickhouse
  • 我不明白为什么有两个表
  • 请再次说明ontime1和ontime2。它们包含相同的数据吗?我可以在您的查询中用另一个替换一个吗?并且只是为了确保我理解您的查询:如果表中有从 1990 年到 2020 年从肯尼迪国际机场起飞的航班,并且从肯尼迪国际机场开始的航空公司是 AA 和 Delta,那么您正在寻找 1990 年到 2020 年由 AA 和 Delta 运营的所有航班不管是什么起源。这是正确的吗?
  • 全球每天大约有 100,000 个航班。假设 50 年来都是这样,而你已经追踪了所有这些;那是18亿次航班。这是很多数据,但您只会对该数据的一小部分感兴趣,所以我的感觉是您正在处理这个错误。

标签: sql database clickhouse


【解决方案1】:

考虑使用WITH Clause

WITH (
  SELECT (MIN(FlightDate), MAX(FlightDate), groupUniqArray(AirlineID)) /* tuple with required aggregates */
  FROM ontime2
  WHERE Origin='JFK'
) AS cte
SELECT
  FlightDate,
  FlightNum,
  Origin,
  Dest,
  AirlineID
FROM
  ontime1
WHERE 
  FlightDate >= cte.1 AND
  FlightDate <= cte.2 AND
  has(cte.3, AirlineID)
LIMIT 10;

【讨论】:

  • 这不会使用ontime1主键索引。可能最好从WITH 只返回一个平面行并使用in
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2023-03-27
  • 1970-01-01
  • 2013-08-08
  • 2017-06-19
相关资源
最近更新 更多