SQL замедляется только при сравнении значений в JOIN (Presto / Amazon Athena) - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть две таблицы, одна из которых содержит данные, другая - метаданные.

Основная таблица данных содержит сетку геопространственных координат (до миллиардов строк).Координаты проецируются на конкретную систему координат.Соответствующая часть схемы:

 ------------------
| x     | smallint |
|------------------|
| y     | smallint |
|------------------|
| value | string   |
 ------------------

Таблица метаданных содержит соответствующие значения широты и долготы для координат x, y.Соответствующая часть схемы:

 ----------------------------
| x         | smallint       |
|----------------------------|
| y         | smallint       |
|----------------------------|
| latitude  | decimal(18,15) |
|----------------------------|
| longitude | decimal(18,15) |
 ----------------------------

СОЕДИНЕНИЕ по этим двум таблицам позволяет узнать фактическую широту / долготу для конкретной координаты X / Y.Это облегчит запросы к таблице, поскольку вам не нужно ничего знать о проекции карты.

Пример запроса, который извлекает строки из таблицы:

SELECT 
  main.x,
  main.y,
  latitude,
  longitude,
  value
FROM database.main JOIN database.meta
ON main.x=meta.x AND main.y=meta.y
WHERE
  main.x=1 AND main.y<=2

Набор результатов будет выглядеть следующим образом:

 --------------------------------------
| x | y | latitude | longitude | value |
|--------------------------------------|
| 1 | 1 | 12.345   | 54.321    | row1  |
|--------------------------------------|
| 1 | 2 | 12.345   | 98.765    | row2  |
 --------------------------------------

Этот запрос занимает всего 1-2 секунды,отлично!

Моя проблема в том, что когда я запускаю запрос, который добавляет предложение WHERE, сравнивающее широту и долготу, запрос работает, но для его выполнения требуется более 60 секунд ...

Например:

SELECT 
  main.x,
  main.y,
  latitude,
  longitude,
  value
FROM database.main JOIN database.meta
ON main.x=meta.x AND main.y=meta.y
WHERE
  latitude=DECIMAL '12.345' AND longitude=DECIMAL '98.765'

Я знаю, что, возможно, мне не хватает чего-то фундаментального в SQL и JOIN, что вызывает медленный запрос.Независимые запросы к любой таблице являются сверхбыстрыми, поэтому я знаю Я делаю что-то не так, что связано с JOIN.

Итак, вопрос в том, как мне сделать так, чтобыэто (казалось бы) простое сравнение завершается всего за несколько секунд, а не за 60 секунд?

1 Ответ

0 голосов
/ 12 ноября 2018

Наиболее вероятное объяснение низкой производительности при добавлении JOIN состоит в том, что нет индекса, который можно использовать для оптимизации объединения.

В вашем случае указание индекса на main(x,y) является наиболееможет ускорить JOIN.

...