ant0ni02004 Цитата: вот его, Декартово произведение и имею в виду. какое же тут другое может быть
У Вас каша с комбинациями и индексами. Напомню (можете провикипежить), индексы были придуманы человечеством, чтобы не искать методом перебора всех комбинаций. При поиске по индексу уменьшается количество сравнений...
Например наша таблица это "куча", нет кластерного индекса. То есть данные не отсортированы, а вот ссылки в индексе отсортированы по значению поля. В классическом случае мы делим индекс (список ссылок) пополам. Берём среднюю ссылку и сравниваем значение поля с искомым. Если меньше, берём меньшую часть и снова делим пополам. Так мы делаем пока не найдём. То есть поиск в таблице с миллионом записей может быть равен трём значениям, хотя такой же поиск в таблице с тысячей записей будет равен десяти операциям сравнений.
Именно по этому количество операций сравнений равно функция от индекс.
Count(Join)=t1*index(t2),
Count(LeftJoin)=t1*index(t2)
Цитата: это результат один и тот же, а вот количество комбинаций, которые просматриваются для получения результата - разные (хотя опять же, умный оптимайзер может догадаться)
Во первых и результат один и тот же и исходные данные одни и те же. Начертите в Экселе две таблицы с пятью записями и найдите случай когда Вам понадобится разное количество сравнений. Если получится, то считайте, что Нобелевскую премию Вы заработали. С обоими join абсолютно необходимо одинаковое математическое усилие.
Цитата: оптимайзер может догадаться
Оптимайзер может "догататься", что если простой фильтрующий join по маленькой табличке выполнить раньше следующих join, то меньше нужно сравнений. Относительно left join это не касается.
Добавлено: Я не рассматриваю случаи с не классическими индексами и смешенной организацией памяти базы - диск + ОЗУ. Так же исключена статистика индексов и так далее. Всё это может повлиять на выбор следующего join для оптимайзера, в моём примере PLAN одинаковый.