Николай Пономаренко:
> Hello, All!
>
> Есть(не у меня) запрос, в котором джойнятся две процедуры, и, что самое
> неприятное, лефтом. Подумав, а потом почитав
> http://www.ibase.ru/devinfo/dataaccesspaths.htm
> "Так как алгоритм слияния не поддерживается для внешних соединений,
> то всегда будет выбран рекурсивный алгоритм."
>
> Выходит что для такой ситуации выхода нет и в ближайшее время не придвидится?
> (как обойти проблему понятно, но интересует именно возможность слияния для
> внешних соединений - это какое-то принципиальное ограничение?)
>
> 10 вызовов p2
> select * from
> proc_1 p1
> join proc_2 p2 on p1.id_1=p2.id_2
> PLAN MERGE (SORT (PROC_2 NATURAL), SORT (PROC_1 NATURAL))
>
> 200 вызовов p2
> select * from
> proc_1 p1
> left join proc_2 p2 on p1.id_1=p2.id_2
> PLAN JOIN (PROC_1 NATURAL, PROC_2 NATURAL)
>
> create procedure proc_2
> returns (id_2 integer)
> as
> declare variable q integer;
> begin
>   id_2 = 20;
>   while (id_2>0) do
>   begin
>     suspend;
>     id_2 = id_2 - 2;
>     q = gen_id(gen_1, 1);
>   end
> end
>
> CREATE PROCEDURE PROC_1
> RETURNS (
>     ID_1 INTEGER)
> AS
> begin
>   id_1 = 20;
>   while (id_1>0) do
>   begin
>     suspend;
>     id_1 = id_1 - 1;
>   end
> end
>
В данном случае, немного модифицировав процедуры, можно left заменить
на inner.

Ответить