Hello, Качановский!
You wrote  on Wed, 6 Sep 2006 09:28:22 +0300:


>> Можно left join использовать и "where t2.somefield is null", однако, not
>> exists лучше imho. Специального оператора (кроме not exists) не
>> припоминаю.

КД> чем это not exist лучше???
КД> если я все правильно путаю, то НОТ ЕКЗИСТ выполняет
КД> выборку записей на каждую запись первой таблицы
КД> в то время, как ЛЕФТ ДЖОЙН единожды объединяет две
КД> выборки
И ты с гарантией точно можешь сказать, как это сервер "унутре себя" делает? Ладно, чтобы не быть голословным. Есть таблица договоров по ссудам и таблица платежей по этим самым ссудам. Выбираю договоры, по которым еще не было платежей.

Вариант с not exists:

select * from agrees a
where not exists (select agr_id from payments where agr_id=a.id)

------ Performance info ------
Prepare time = 0ms
Execute time = 16 ms
Avg fetch time = 0,66 ms
Current memory = 648 176
Max memory = 660 160
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 3 633

Вариант с left join

select * from agrees a
left join payments p on p.agr_id=a.id
where p.agr_id is null

------ Performance info ------
Prepare time = 0ms
Execute time = 47ms
Avg fetch time = 1,00 ms
Current memory = 645 292
Max memory = 660 160
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 15 399

Так что... Запрос не по одному разу выполнялся, в среднем соотношение в пользу варианта с not exists. Возможно, на других данных картина будет несколько другой, но вот так на паре наобум взятых таблиц я получил явное преимущество not exists по сравнению с left join.

Удач
--
Alexander A. Venikov, Tobolsk, Russia
Real e-mail address is venix<angry_dog>tn<dot>tob<dot>ru

Ответить