LEFT JOIN или...

simp
Дата: 21.10.2005 09:40:37
подскажите пожалуйста, какой вариант работает быстрее?
1)
select o.fid_d, o.numbox, o.numych, o.indexoper, o.obozdok, o.kodoper, o.nameoper, o.equipment1, o.id, o.kodobor, o.equipment2, o.yt, t.kod, t.classjob, t.vremy
    from 
    op_all o left join time_svr t on (o.fid_d = t.idfile) and (t.fidp=0) and (o.id = t.fidop)
    where o.fid_d = :file_id
2)
for select numbox, numych, indexoper, obozdok, kodoper, nameoper, equipment1, id, kodobor, equipment2, yt 
     from op_all
     where (fid_d=:file_id)   
  into  :box, :ych,  :ind, :obozdok, :kodoper, :name, :equipment1, :fidop, :kodobor, :equipment2, :yt
    do begin
           KOD=null;
           CLASSJOB=null;
           VREMY=null;
           select kod, classjob, vremy from time_svr
           where (idfile=:file_id and fidop=:fidop and fidp=0)
           into :KOD, :CLASSJOB, :VREMY;
         suspend;
        end;

разве в первом случае не дольше?
Dik76
Дата: 21.10.2005 09:57:54

simp

Так ты попробуй!

--
Dik76

Posted via ActualForum NNTP Server 1.3

srf2000
Дата: 21.10.2005 09:59:08
simp
подскажите пожалуйста, какой вариант работает быстрее?
1)
select o.fid_d, o.numbox, o.numych, o.indexoper, o.obozdok, o.kodoper, o.nameoper, o.equipment1, o.id, o.kodobor, o.equipment2, o.yt, t.kod, t.classjob, t.vremy
    from 
    op_all o left join time_svr t on (o.fid_d = t.idfile) and (t.fidp=0) and (o.id = t.fidop)
    where o.fid_d = :file_id
2)
for select numbox, numych, indexoper, obozdok, kodoper, nameoper, equipment1, id, kodobor, equipment2, yt 
     from op_all
     where (fid_d=:file_id)   
  into  :box, :ych,  :ind, :obozdok, :kodoper, :name, :equipment1, :fidop, :kodobor, :equipment2, :yt
    do begin
           KOD=null;
           CLASSJOB=null;
           VREMY=null;
           select kod, classjob, vremy from time_svr
           where (idfile=:file_id and fidop=:fidop and fidp=0)
           into :KOD, :CLASSJOB, :VREMY;
         suspend;
        end;

разве в первом случае не дольше?


вообще-то 1 и 2 - разные вещи
simp
Дата: 21.10.2005 10:15:23
Я попробовала, объем данных небольшой, наверное поэтому разницы особой нет, а как правильно?
to srf2000: в каком смысле разные вещи?
я понимаю, что это не одно и тоже, но результат в данном случае одинаков.
Карабас Барабас
Дата: 21.10.2005 10:15:50
Не вчитывался в код :)) но ... а проверить ?

PS: как-то давно заметил, что при выборке большого кол-ва полей в запросах с джоинами были ощутимые тормоза, когда же переписал в процедуру с фор-селект без джоина и выборкой записей из присоединяемых таблиц внутри цикла, то скорость заметно возросла. Хотя может тогда причина была в недостаточной оптимизации запроса ..... Сейчас же особых тормозов с джоинами не замечал уже давненько.

Posted via ActualForum NNTP Server 1.3

sag494
Дата: 21.10.2005 10:28:37
simp
select ...
    from  op_all o left join time_svr t on (...)
    where o.fid_d = :file_id
этим сервер не запутаешь. На планы обоих запросов взгляни.
simp
2)
for select ...    from op_all   where (fid_d=:file_id)    into  ...
   do begin
           ...
           select ...... from time_svr into ...
         suspend;
        end;
разве в первом случае не дольше?
В данном случае нет, теоретицки второй будет чуть медленней за счет присвоения переменных и проч., но реально почувствовать разницу в скоростях вряд ли удастся.
vado
Дата: 23.10.2005 07:01:54
Что быстрее? А забросать тестируемую таблу немереным количеством данных и проверить? - это ж совсем несложно!
_______________________________________
Есть такая профессия - Родину защищать.