Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Замена JOIN OR на аналог / 4 сообщений из 4, страница 1 из 1
23.12.2016, 13:48
    #39373739
execa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена JOIN OR на аналог
Доброго времени суток!
Существует запрос (в укороченном виде):
Код: plsql
1.
2.
SELECT * FROM a.table t 
JOIN a.table_join tj ON tj .id= t.id OR tj .id = a.table_other.id


Хотелось бы переписать имеющийся JOIN на два, дающих аналогичный результат. Какая из таблиц меньше t или tj неизвестно.
Есть вариант с union, но посколько цельный запрос довольно не маленький, придется его еще увеличивать.
Может есть решение с ипользованием нескольких join, но чтобы не было OR (в производительности проседает очень сильно).
...
Рейтинг: 0 / 0
23.12.2016, 14:00
    #39373752
execa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена JOIN OR на аналог
Скорее даже такой запрос, чтобы было понятно, что загвоздка в том, что данные кроме joina будут использоваться в другихместах
Код: plsql
1.
2.
3.
SELECT t.field, count(tj.id) FROM a.table t 
JOIN a.table_join tj ON tj .id= t.id OR tj .id = a.table_other.id
JOIN a.inner_table it ON tj.foreign_id = it.id
...
Рейтинг: 0 / 0
23.12.2016, 20:46
    #39374198
Alexander Titkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена JOIN OR на аналог
execa,

Сделайте два соединения с table_join по своим условиям, оберните в подзапрос и используйте дальше как угодно. Правда еще тот изврат, с OR хоть читабельно.
...
Рейтинг: 0 / 0
24.12.2016, 14:29
    #39374369
execa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена JOIN OR на аналог
Alexander Titkin, да, спасибо.

Другого варианта как сделать два подзапроса по условиям и склеить их через union all, я не нашел. Если есть or в условии, то планер не использует индексы, а в подзапросах использует, выигрыш получается колоссальный - в десятки раз.

Самое интересное, что по тестам, даже если выбирать почти все данные из таблиц (индекс бесполезен), то такой вариант все равно выигрывает в скорости, думаю за счет того, что я выдернул и отдал только параметры нужные в других местах, а это быстрее, чем склеивать целые таблицы.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Замена JOIN OR на аналог / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]