Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> join / wher 
:(
    Опции темы
setnull
Дата 28.9.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

Репутация: нет
Всего: 1



Все здравствуйте!!!

Интересует такой нюанс:
в чем технически разница между условиями в блоке соединения таблиц и блоке where запроса. (при условии, что логическая разница отсутствует smile)

к примеру, чем запрос

Код

select
........
from table1
inner join table2 on table2.f1 = table1.f1 and table2.f2 in (v1, v2)


отличается от запросов

Код

select
........
from table1
left join table2 on table2.f1 = table1.f1 and table2.f2 in (v1, v2)
where table2.f1 is not null

select
........
from table1
inner join table2 on table2.f1 = table1.f1
where table2.f2 in (v1, v2)


Думаю, это еще зависит и от конкретной СУБД?


Спасибо!!!
PM MAIL   Вверх
skyboy
Дата 28.9.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



в случае с inner join - where выполняется после всех соединений. а условия on - в момент соединения. то есть, если будет join трех таблиц по 1000 записей, то вариант с where сначала построит декартово произведение миллиарда записей, а потом их отфильтрует. А использование ON после первого соединения выдаст не 1000 * 1000 записей, а сколько соответствует условию. И второе соединение с третьей таблицей уже будет оперировать меньшим количеством записей.
в случае с left join, в общем случае, у тебя вообще разные результаты получатся. а вот приведенный тобою пример быссмысленен:
Цитата(setnull @  28.9.2009,  10:16 Найти цитируемый пост)
left join table2 on table2.f1 = table1.f1 and table2.f2 in (v1, v2)
where table2.f1 is not null

это действительно, "эмуляция" inner join, но с большими тормозами. потому что строится декартово произведение, а потом уже его фильтруют.
PM MAIL   Вверх
Zloxa
Дата 28.9.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(setnull @  28.9.2009,  11:16 Найти цитируемый пост)
Интересует такой нюанс

Чем вызван интерес?
Цитата(setnull @  28.9.2009,  11:16 Найти цитируемый пост)
к примеру, чем запрос

Цитата(setnull @  28.9.2009,  11:16 Найти цитируемый пост)
отличается от запросов

семантикой.
Цитата(setnull @  28.9.2009,  11:16 Найти цитируемый пост)
Думаю, это еще зависит и от конкретной СУБД?

Абсолютно правильно думаешь.
Обсуждение этой темы бессмысленно на уровне, абстрагированном от платформы.




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 28.9.2009, 11:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



skyboy, SQL выражение декларирует форму и вид получаемого набора, но никоим образом не декларирует способ получения этого набора. Какие операции будут выполнены и в какой последовательности определяет SQL машина на основании правил, заложенных в ней. у меня есть все основания полагать что  оракл все три запроса выполнит одинаково.

ЗЫ Недавно похожая тема обсуждалась

ЗЫЫ 
Цитата(skyboy @  28.9.2009,  11:33 Найти цитируемый пост)
это действительно, "эмуляция" inner join,

Это не эмуляция, это обфускация.

Это сообщение отредактировал(а) Zloxa - 28.9.2009, 11:59


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
setnull
Дата 28.9.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

Репутация: нет
Всего: 1



вот живой пирмер:
Есть таблица t1.
Из нее нужно выбрать записи, с которыми возможно соединить записи (через вторую t2) с одной из двух других таблиц t3 и t4.
t1->t2->t3
либо
t1->t2->t4
Что будет лучше
всю попроисоединять к t1 и посмотреть, где это получилось, либо сделать выборку из t1, а в where указать два excists'а?
или вообще сделать union?
Конкретно меня интересует ситуация с MySql.
Но также хотелось бы узнать, есть ли какие-нибудь общие критерии, закономерности?
PM MAIL   Вверх
Zloxa
Дата 28.9.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161




M
Zloxa
Перенесено из баз данных


Добавлено через 2 минуты и 39 секунд
Цитата(setnull @  28.9.2009,  12:29 Найти цитируемый пост)
Что будет лучше

Пробуй, мерий.
Общего случая нет. На разных объемах будут разные результаты.
Мне лично кажется что два экзиста должны быть шустрее.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 28.9.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 2
Всего: 54



setnull, какая структура таблиц (с указанием полей по которыйм производиться соединение), а так же критерий для CASE или EXISTS?


--------------------
Слава Україні!
PM MAIL   Вверх
setnull
Дата 28.9.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

Репутация: нет
Всего: 1



Цитата(Gluttton @ 28.9.2009,  16:42)
setnull, какая структура таблиц (с указанием полей по которыйм производиться соединение), а так же критерий для CASE или EXISTS?

у меня вопрос больше общего характера...
но струтура
Код


t1(
    id  int (pk)
    filter1 int (index)
   )

t2(
   id int (pk)
   ref_t1  (fk t1.id)(index)
   )

t3(
   id int(pk)
   ref_t2  (fk t2.id)(index)
    filter3 int (index)
   )

t4(
   id int(pk)
   ref_t2  (fk t2.id)(index)
    filter4 int (index)
   )


Нужно вибрать записи из t1, соответствующие  ограничениям по filter1, и при этом также имеющие соответствующие записи в таблицах t3 либо t4, в свою очередь фильтруемые filter3 и filter4
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1857 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.