通过仅重用一次内部查询来优化查询
Query optimization by reusing the inner query only once
考虑以下查询
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
建立索引
加入table也不是最佳选择,因为table数据太大
如何在不重复相同查询的情况下重复使用内部查询?
考虑使用 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;
考虑以下查询
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
加入table也不是最佳选择,因为table数据太大
如何在不重复相同查询的情况下重复使用内部查询?
考虑使用 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;