powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / for select if exists против join
7 сообщений из 7, страница 1 из 1
for select if exists против join
    #32182562
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, как праздники? А я почти не пил, поэтому вопрос. Я тут опять с нерелятивистскими подходами!

вот пишу так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
for
  select  "out"  from  "mysp" (: "string" )
  into : "out" 
do
begin
  if 
  (
    exists
    (
       select  "fld"  from  "tbl"  where  "fld2"  = : "out"  and еще условия
    )
  )
  then
    suspend;
end


Не подскажете ли, когда это все скомпилируется, будет ли это равно такой структуре:

Код: plaintext
1.
2.
3.
4.
for
  select  "out"  from  "mysp" (: "string" ) as  "sp" ,  "tbl" 
  where  "tbl" . "fld2"  =  "sp" . "out"  and еще условия
  into : "out" 
do begin suspend; end


???

Зачем я опять мудрю? Ну по неопытности.
Во-первых, поскольку я пока плохо знаю, как join соптимизируется: будет ли он по очереди брать следующую строку, которую выводит mysp и проверять, есть ли соответствующая запись в таблице tbl, или он будет брать следующую запись из tbl и проверять соответствие в какой-то временной таблице, где будет результат mysqp?

Во-вторых, сохранится ли порядок, в каком выводились строки в mysp? Ведь в принципе, поскольку я никакого явного order во втором примере не поставил, только неточное знание того, как работает разборщик запросов, будет гарантировать мне желаемый порядок. А первый пример - я явно заставляю сохранять порядок.

В принципе, вопрос в том числе и по скорости работы первого и второго вариантов (мне на первый взгляд кажется, что это одно и тоже, и что именно так должен работать join).
...
Рейтинг: 0 / 0
for select if exists против join
    #32183044
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего соединение будет быстрее, если есть индексы, конечно.
Если хочешь - проверь количество обращений к таблицам в статистике.
...
Рейтинг: 0 / 0
for select if exists против join
    #32183522
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Статистикой пока не умею пользоваться. Где читать?

А про то что будет быстрее, думал мож кто сразу знает, может на BLR кто программирует..

Может, и мне посоветуешь спросить на news://forums.demo.ru/epsylon.public.interbase ?
...
Рейтинг: 0 / 0
for select if exists против join
    #32183557
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, на news с такими вопросами не ходи :-))) Туда только если что-то серьёзное.
Возьми IBExpert и там тебе вся статистика прямо графиками будет показываться.
если построены индексы по полям и они использкются, то join будет быстрее.
...
Рейтинг: 0 / 0
for select if exists против join
    #32183588
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у меня все серьезно, это просто у меня голос такой

Я, слава Богу, не задаю уже лет шесть вопросы типа "как вывести максимальное значение для каждой даты". Ясно, что с радостью мне на такой вопрос все бы ответили, да и я сам тоже :)

А кстати у меня вопрос-то не только по скорости но и про сохранение порядка, в котором выдает mysp. Ведь, наксолько я понимаю, когда делается джоин, то сервер тоже идет по первой таблице, смотрит, подходит ли запись под все условия, если среди условий есть сравнение с полем другой таблицы, находит по индексу быстренько запись, сравнивает, если подходит - выдает в ответ. Если не подходит, бросает эту запись и берет следующую запись.

То есть я думаю , что сервер так поступает. Я прочитал про свой ранее любимый mysql (прямо в справке - очень хорошая там справка), что он именно так и делает, и решил, что так все делают, потому что это логично.

Но ведь может быть и не так. Например, сервер сначала берет все таблицы, берет все строки во временную таблицу, которые возвращает mysp, а потом джоинит эту таблицу как привык, так, как если бы это была обычная таблица без индекса... и тогда порядок сохраниться вовсе не должен, а мне надо чтобы сохранился.

Ну, спасибо, что дочитал! :)
...
Рейтинг: 0 / 0
for select if exists против join
    #32183591
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже сервер от моих вопросов грохнулся.
...
Рейтинг: 0 / 0
for select if exists против join
    #32183601
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для порядка - order by есть, е что до порядка таблиц - не знаю. Наверное для левого и правого соединения есть ведущая таблица, а для других - не знаю, как оно там, да и какая разница.
Да и вобще, насколько я помню, если в запросе учавствуют отношения (типа таблицы и представления), то сначала выполняется соединение по значениям индекса, а потом на основании этого соединения вытаскиваются данные. Как-то так оно делается. Поэтому нельзя и ХП соединять кроме как левым способом :-)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / for select if exists против join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]