EXISTS vs JOIN

Новичок 2008
Дата: 18.11.2008 16:34:20
сорри за наверное наивный вопрос, но при прочих равных условиях что эффективнее EXISTS или JOIN? Есть конкретный пример, могу привести план и статистики (результаты противоположные на 9-ке с RBO и 10-ке с CBO), но это наверное довольно известный вопрос. Но ни в FAQ ни в гугле пока ничего не нашел.
Жареный петух
Дата: 18.11.2008 16:36:11
Новичок 2008
но при прочих равных условияхчто эффективнее EXISTS или JOIN?


При прочих - это при каких ? Это логически разные вещи.
Новичок 2008
Дата: 18.11.2008 16:42:02
Жареный петух
Новичок 2008
но при прочих равных условияхчто эффективнее EXISTS или JOIN?


При прочих - это при каких ? Это логически разные вещи.


понятно, что разные. Но есть случаи, когда они приводят к одинаковой выборке:
select a.* from a,b where a.id=b.id
и
select a.* from a where exists (select 1 from b where id=a.id)
скажем для простоты: ID - PRIMARY KEY в обеих таблицах. Этот случай и имеется в виду
DВА
Дата: 18.11.2008 16:48:08
ну так посмотрите планы обоих запросов "при прочих равных" и найдите отличия :)
Новичок 2008
Дата: 18.11.2008 17:13:33
DВА
ну так посмотрите планы обоих запросов "при прочих равных" и найдите отличия :)

т.е. общих рекомендаций, ценного опыта, которым хочется поделиться, нет?
_мод
Дата: 18.11.2008 17:23:08
Новичок 2008
select a.* from a,b where a.id=b.id

это логическая ошибка, т.к. b.* не присутствует в select ...
ITGOOD
Дата: 18.11.2008 17:25:07
_мод
Новичок 2008
select a.* from a,b where a.id=b.id

это логическая ошибка, т.к. b.* не присутствует в select ...


А я никакой ошибки здесь не вижу :)
Vint
Дата: 18.11.2008 17:27:08
_мод,
Оба на а пацаны то не знают шо есть логическая ошибка...
Сам придумаеш пример или подсказать?

Новичок 2008
При прочих равных напишите как Вам нравится и не парьтесь. главное ведь не как написано, а чтобы работало быстро и правильно. Тем более что Вам уже сказали - это вещи разные и используются для разных целей, и сравнивать их не стоит, а то сферический конь в вакууме получится
Новичок 2008
Дата: 18.11.2008 17:48:12
Vint
главное ведь не как написано, а чтобы работало быстро и правильно.

в принципе да, тут не поспоришь :-). Просто я думал, что гуру сейчас скажут: типа чего ломиться в открытую дверь, все уже известно и написано, просто ты, лопух, не знаешь где искать...
А ситуевина у меня была такая: у заказчика проблемы с перформансом у одной программки (сервер - 9-ка которую заставляют работать с RBO). Смотрю - вредный SQL с кучей UNION-в и в каждом под-запросе: EXISTS. Я не понял, зачем такие сложности, переделал на JOIN, consistent gets уменьшилось в 60 раз, время выполнения в 7 раз. Приношу, довольный, решение. А мне говорят: "Ты знаешь, это был наш первоначальный вариант и на нашем тестовом сервере (10-ка с CBO) у нас с ним были проблемы с эффективностью. Переделали на EXISTS - и всё в порядке". Я попробовал - и впрямь! Вот стоял ошарашенный и и подумал, спрошу у умных людей...
сиська
Дата: 18.11.2008 17:56:40
погоди,
как ты с легкостью переделал exist на join, если логика разная у запросов?
запрос с exist вернет по одной строке на каждое совпадение, с join в результате станет строк столько сколько совпадений

таблица А (ID)
1

таблица Б (ID, A_ID)
1 1
2 1
3 1