db_link и низкая скорость по tcp

sef
Дата: 09.06.2006 23:18:39
создаю следующий код

declare
    a number := 0;
begin
    for v in (select * from A@db_link where rownum < 5000)
    loop
        a := a+1;
    end loop;
    dbms.out..('a='||a);
end;
/
a=4999

это работает но проблема в том, что неприлично долго. анализ сетевого трафика показывает, что в определенный момент времени используется не более 8-15 кБит/с, хотя между базами DSL в одну 4 МБит и в другую около 200 кБит. почему такое происходит и как с этим бороться?

ping remote_host дает время около 60-80 ms; при копирование большого файла средсвами scp с одного сервера на другой, имеем хорошую скорость, согласно ширине канала.

пробовал на удаленном сервере создавать процедуру, которая собирает данные в таблицу рЕкордов (т.о. создавая большой объект в памяти оракла на удаленной машине(?)). при вызывове этой процедуры скорость лучше не стала..
Barkovsky
Дата: 09.06.2006 23:25:46
гы, что вы хотите от больного сознания, мужчина?
ваш код фетчит по одной записи с удаленного сервера.
Anton Demidov
Дата: 09.06.2006 23:36:35
Развивая мысль Барковского
sef
... where rownum < 5000
...
ping remote_host дает время около 60-80 ms

умножаем:
5000 * 80 = 400 секунд
сходится?
sef
Дата: 09.06.2006 23:40:14
Barkovsky
ваш код фетчит по одной записи с удаленного сервера.

верно. но вот другой "условный" пример, который работает так же дико долго:


код в локальной сессии:
declare
    type l_rec_tab_type is table of a@db_link;
    l_rec_tab l_rec_tab_type;
    a number := 0;
begin
    proc1(l_rec_tab)@db_link;
    for l_rec_tab.first .. l_rec_tab.last loop
        a := a+1;
    end loop;
end;
удаленная процедура готовит данные в l_rec_tab
возможно с ошбками, но ссуть в том, что пытаюсь с удаленного сервера уже получить готовый объект. неправильно? почему? и как надо?
sef
Дата: 09.06.2006 23:42:33
Anton Demidov
Развивая мысль Барковского
sef
... where rownum < 5000
...
ping remote_host дает время около 60-80 ms

умножаем:
5000 * 80 = 400 секунд
сходится?


все гораздо хуже - в районе 2000 секунд. правда, в одной строке данных порядка 10-12 килобайт данных.
Barkovsky
Дата: 09.06.2006 23:47:05
а вы на это пойдете?)

надо: забыть про использование PL/SQL, писать на чистом SQL.
sef
Дата: 09.06.2006 23:53:23
Barkovsky
а вы на это пойдете?)

надо: забыть про использование PL/SQL, писать на чистом SQL.


имеется ввиду что-то вроде insert into A as select * from A@db_link ? может еще и с использованием временных таблиц в случае необходимости предварительной обработки данных? как.то не подумал про это. если это поможет-буду счастлив, хотя придется трансфер хорошо перелопатить.
Barkovsky
Дата: 10.06.2006 00:01:46
это поможет. вторая мысль тоже верная.
sef
Дата: 10.06.2006 00:03:58
Barkovsky
это поможет. вторая мысль тоже верная.

спасибо большое. попробую в понедельник.
Вячеслав Любомудров
Дата: 12.06.2006 09:08:00
И еще можно попробовать покрутить SDU в tnsnames и MTU в настройках TCP