Hello, Dmitry!
You wrote  on Thu, 11 Sep 2008 14:20:30 +0300:

>> А разве они не уйдут внутрь?
DL> Поменяй условие и посмотри как будет.

Поменял, ничего не изменилось.
И все же хочется узнать точно, разве в запросах вида

select
 *
from table1 t1
join table2 t2 on t2.id=t1.id
where t1.f1=15

условие where t1.f1=15 не вносится "внутрь" ДО выполнения джойна? Первоисточник гласит что все же вносится. После него я собсно и стал выносить лишнее в where, в целях удобочитаемости запросов.

http://ibase.ru/devinfo/dataaccesspaths.htm
. С целью уменьшения результирующей кардинальности выборки, проверка предикатов всегда ставится как можно "ниже" ("глубже") в дерево выполнения запроса.
...
В то время как для внутренних и полных внешних соединений входные потоки независимы и могут читаться в произвольном порядке,
...
Если вспомнить пункт 2.1, где описан принцип максимально "глубокого" помещения предикативных фильтров оптимизатором, то становится понятен один момент: индивидуальные табличные фильтры уйдут "ниже" методов соединения. Соответственно, в случае предиката вида (WHERE MASTER.F = 0) и отсутствии в таблице "MASTER" записей с полем "F", равным нулю, обращений к внутреннему потоку соединения вообще не будет, так как в данном случае нет итерации по внешнему потоку (в нем нет записей).

--
-=Деньги то начинают кончаться,то кончают начинаться=-
With best regards, Nikolay Ponomarenko

Ответить