Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 dbms_hs_passthrough.get_value съедает память  [new]
vava
Member

Откуда: пока Масква
Сообщений: 424
Добрый день.
Считываю таблицу из MSSQL используя dbms_hs_passthrough (из-за длинных полей в источнике).
Есть две проблемы:

1. commit приводит к закрытию курсора dbms_hs_passthrough (но тут помогла автономная транзакция).

2. Примерно через миллион итераций dbms_hs_passthrough.fetch_row заканчивается память (ORA-04030). Память отъедается пропорционально количеству просмотренных строк и количеству извлекаемых столбцов (фактически, пропорционально прочитанной площади). К проблеме приводит даже такая конструкция:

...
  loop
    res:=dbms_hs_passthrough.fetch_row@mssql(cur);
    exit when res=0;
    dbms_hs_passthrough.get_value@mssql(cur,1,x_1);
    dbms_hs_passthrough.get_value@mssql(cur,2,x_2);
    dbms_hs_passthrough.get_value@mssql(cur,n,x_n);
  end loop;
  ...


Подскажите, как прочитать таблицу, ведь заранее неизвестно, на какие куски её можно порезать чтоб прочитать частями.

10.2.0.1, enterprise, win32
6 июн 12, 14:11    [12674540]     Ответить | Цитировать Сообщить модератору
 Re: dbms_hs_passthrough.get_value съедает память  [new]
vava
Member

Откуда: пока Масква
Сообщений: 424
причем
dbms_hs_passthrough.close_cursor
память не очищает.
Очищается память лишь после
execute immediate 'alter session close database link mssql'
6 июн 12, 16:27    [12676226]     Ответить | Цитировать Сообщить модератору
 Re: dbms_hs_passthrough.get_value съедает память  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15441
vava
Добрый день.
Считываю таблицу из MSSQL используя dbms_hs_passthrough (из-за длинных полей в источнике).
Есть две проблемы:

1. commit приводит к закрытию курсора dbms_hs_passthrough (но тут помогла автономная транзакция).

2. Примерно через миллион итераций dbms_hs_passthrough.fetch_row заканчивается память (ORA-04030). Память отъедается пропорционально количеству просмотренных строк и количеству извлекаемых столбцов (фактически, пропорционально прочитанной площади). К проблеме приводит даже такая конструкция:

...
  loop
    res:=dbms_hs_passthrough.fetch_row@mssql(cur);
    exit when res=0;
    dbms_hs_passthrough.get_value@mssql(cur,1,x_1);
    dbms_hs_passthrough.get_value@mssql(cur,2,x_2);
    dbms_hs_passthrough.get_value@mssql(cur,n,x_n);
  end loop;
  ...


Подскажите, как прочитать таблицу, ведь заранее неизвестно, на какие куски её можно порезать чтоб прочитать частями.

10.2.0.1, enterprise, win32

сервер у вас отсталый. ну а насчет процедур на базе за гетерогенным линком - подумайте над тем, чтобы уйти от построчно-поатрибутной обработки. например, из порции данных (~20000 строк) создаете за линком вью (или темптаблицу) при этом типы преобразуете, чтобы можно было из оракла забрать их запросом..
6 июн 12, 17:04    [12676602]     Ответить | Цитировать Сообщить модератору
 Re: dbms_hs_passthrough.get_value съедает память  [new]
vava
Member

Откуда: пока Масква
Сообщений: 424
orawish,

В более свежих версиях ограничения на 30 символов уже нет?
В текущей ситуации. Правильно ли я понимаю, что получив возможность подключения к другим базам, нужно ещё и требовать права на создание объектов (вью или таблиц) ? И создав порцию данных (в 20000 строк), как потом определить то место в исходной таблице, с которого начинать следующий кусок в 20000 строк? (ведь наполнение данными в источнике не известно - есть ли PK, какова равномерность по каждому столбцу и т.п.). Другими словами - есть различные ОДБС источники, с которых можно брать данные (мсскл, терадата и т.п.). Может создать связку из пакета dbms_hs_passthrough и C++ dll - один видит структуру а второй переливает данные?
25 июн 12, 16:00    [12771622]     Ответить | Цитировать Сообщить модератору
 Re: dbms_hs_passthrough.get_value съедает память  [new]
vava
Member

Откуда: пока Масква
Сообщений: 424
Или в PIPE запихивать (из dll сделать пайп сервер). Насколько это будет тормозить и нагрузит SGA?
25 июн 12, 16:05    [12771666]     Ответить | Цитировать Сообщить модератору
 Re: dbms_hs_passthrough.get_value съедает память  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15441
vava
orawish,

В более свежих версиях ограничения на 30 символов уже нет?
В текущей ситуации. Правильно ли я понимаю, что получив возможность подключения к другим базам, нужно ещё и требовать права на создание объектов (вью или таблиц) ? И создав порцию данных (в 20000 строк), как потом определить то место в исходной таблице, с которого начинать следующий кусок в 20000 строк? (ведь наполнение данными в источнике не известно - есть ли PK, какова равномерность по каждому столбцу и т.п.). Другими словами - есть различные ОДБС источники, с которых можно брать данные (мсскл, терадата и т.п.). Может создать связку из пакета dbms_hs_passthrough и C++ dll - один видит структуру а второй переливает данные?

ограничения на длину имен объектов в оракле пока незыблемы - 30 (только не символов, а байт, что бывает гораздо короче).
как делить набор данных на порции - вопрос сугубо творческий. изучайте правила жизни ваших данных и думайте.
права, разумеется, нужны.
25 июн 12, 17:00    [12772094]     Ответить | Цитировать Сообщить модератору
 Re: dbms_hs_passthrough.get_value съедает память  [new]
vava
Member

Откуда: пока Масква
Сообщений: 424
orawish,

Благодарю за помощь и участие.
К сожалению, забираемые данные - не мои и их распределение заранее не известно. Кроме того, моя база может столкнуться с ОДБС источником, который не поддерживает view (например - ексель или статический аксес). Получается, что сохранить гибкость и прозрачность доступа к чужим таблицам не получится.
26 июн 12, 11:58    [12775462]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: dbms_hs_passthrough.get_value съедает память  [new]
vava
Member

Откуда: пока Масква
Сообщений: 424
Ну, можно сказать что вопрос по-прежнему актуален :) Ни у кого идей не появилось?
Сейчас снова уткнулся в эту проблему из-за такой стандартной задачи:

Нужно ежедневно загружать из Терадаты и MSSQL табличку размером 5-10 млн. записей. Структура будет одинаковая. Сейчас обхожусь прямым линком (select t.* from VIEW@MyLink t), но очень неудобно без параметризации - приходится модифицировать view на источнике.

А как вы решаете такую задачу? Чтоб ещё и производительность не страдала.
Пока на ум приходит только вариант extproc с обратным подключением.
Сервер - виндавс.
3 окт 18, 11:22    [21693818]     Ответить | Цитировать Сообщить модератору
 Re: dbms_hs_passthrough.get_value съедает память  [new]
vava
Member

Откуда: пока Масква
Сообщений: 424
Отпишусь: перешел на 12.2 и проблема исчезла.
12 мар 19, 09:57    [21829966]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить