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