Cor4win
@Cor4win
Изучаю android-разработку

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

Есть селект с джойном следующего вида:
left join table t on t.number = left(d.number, 6)
Т.е. number это некое число-идентификатор, но в таблице d оно хранится в более длинном формате. Поэтому при джойне я использую left для обрезки идентификатора до нужного кол-ва цифр, как он хранится в таблице t.

Проблема в том, что это дико замедляет запрос, происходит это потому что используется функция в условии джойна (с substring ситуация такая же).
Если бы это условие было дополнительным я бы мог вынести его в where и использовать что-то вроде:
t.number like concat(left(d.number, 6), '%'), но никак.
Может есть еще какие-то варианты?)
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
Cor4win
@Cor4win Автор вопроса
Изучаю android-разработку
В итоге я просто добавил один вложенный селект, в котором результат функции left в самом селекте как поле, а далее уже джойн по этому полю. Немного костыльно, может, но я уменьшил время выполнения примерно в ~20 раз))
Может кому пригодится:
select t.id
from ( select left(id, 6) as id from d ) a
left join t on t.id = a.id
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Vitsliputsli
Очень странный способ соединения...
Если бы это была выборка, то можно было бы построить индекс по функции (если СУБД позволяет), а для соединения - делайте денормализацию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы