Оптимизация запроса путем повторного использования внутреннего запроса только один раз - PullRequest
1 голос
/ 16 июня 2020

Рассмотрим приведенный ниже запрос

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

Также присоединение к таблице не является оптимальным, поскольку данные таблицы такие большие

Как можно повторно использовать внутренний запрос, не повторяя один и тот же запрос снова и снова?

1 Ответ

2 голосов
/ 16 июня 2020

Рассмотрите возможность использования Предложение WITH :

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;
...