У меня есть две таблицы, одна из которых содержит данные, другая - метаданные.
Основная таблица данных содержит сетку геопространственных координат (до миллиардов строк).Координаты проецируются на конкретную систему координат.Соответствующая часть схемы:
------------------
| 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 секунд?