#oracle #производительность #odbc #db2
Вопрос сложный и неоднозначный, но надеюсь на любые советы (а может кому и мой опыт
поможет):
Есть сервер с Oracle 11.2.0.3 x32 на Windows Server 2008R2 x64 (4ядра/8 потоков,
8гб оперативы, один HDD без рейда).
В источниках ODBCx32 настроено подключение к DB2 через CLI DRIVER с именем db2
Целевой сервер DB2 находится на мейнфрейме, настроек которого я не знаю, версия 9fix15
Поднят дополнительный listener:
SID_LIST_LISTENERdb2 =
(SID_LIST =
(SID_DESC=
(SID_NAME=db2)
(ORACLE_HOME=C:\app\product\11.2.0\dbhome_1)
(PROGRAM=dg4odbc))
)
LISTENERdb2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1523))
)
)
В tnsnames.ora:
db2 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1523))
(CONNECT_DATA=(SID=db2))
(HS=OK)
)
Создан public dblink:
CREATE PUBLIC DATABASE LINK db2 CONNECT TO
"login" IDENTIFIED BY "pwd" using 'db2';`
Создана процедура:
CREATE OR REPLACE PROCEDURE P_LOAD_DATA IS
BEGIN
insert into data_table select * from data_table@db2 d where d.date_op between TRUNC(SYSDATE
- 4/24, 'HH24') + 1/24/60 AND TRUNC(SYSDATE - 2/24, 'HH24'));
END;/
Создан job на запуск процедуры раз в 2 часа (или 12 джобов на каждый запуск).
Целевая таблица размером примерно 13млн записей по 50 столбцов, моя таблица собирает
архив из целевой и имеет размер примерно 150млн записей тех же 50 столбцов.
Перекачка ~600к записей (150-200мб) занимает в лучшем случае час, периодически переваливает
за 4-5 часов. Плюс хорошо бы держать индексы на таблицу архива, чтобы из нее можно
было потом что-то вытащить в приемлемый срок, но это опционально. Корректный ли выбран
способ наполнения архива или есть альтернативы лучше? Проблема в том, что периодически
джобы прерываются с причиной "Job slave process was terminated", а в логах
ORA-00603: ORACLE server session terminated by fatal error
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[IBM][CLI Driver] CLI0106E Connection is closed. SQLSTATE=08003 {08003,NativeErr
= -99999}
ORA-02063: preceding 2 line
Это вероятно мейнфрейм закрывает подключение по таймауту.
Причина разрядности Оракла - ни один найденный вариант драйвера DB2 не работал на х64.
Ответы
Ответ 1
Ну, очевидно, стоит начать ковырять с анализа того, куда же уходит и час и 4 часа - т.е. включаем трассировку на сессию джоба и анализируем полученный трейс. Дальше, в порядке отработки версии что тормозит DB2 на мейнфрейме, я бы просто отселектил необходимый диапазон, но без записи в таблицу - т.е., как говорят в unix-мире, в /dev/null. Но при этом чтобы IBM отдал все записи и они прошли по сети и db-link'у - т.е. просто SELECT, но с COUNT'ом или группировкой + поиграть с хинтом +driving_site - чтоб точно все записи сначала пришли к нам в Оракл. Ну и потом уже - классические варианты записи большого объема в Oracle - NOLOGGING, +APPEND, варианты с временной таблицей (партицией) и DBMS_REDEFINITION / EXCHANGE PARTITION, удаление индексов до / пересоздание после, BULK INSERT и тд и тп. Главное начать и выяснить, что оптимизировать или где затык. А дальше уже дело техники. Если есть такая физическая/юридическая возможность + необходимость в предлагаемом - если Вы можете предоставить удаленный доступ - с удовольствием помогу решить (или хотя бы "осмотреть наружно" / применить озвученные выше рекомендации) текущую задачку "физически", бо интересный случай + имею предыдущий опыт в решении похожих ситуаций, когда перекачка данных в гетерогенных средах ведет себя не так, как ожидается. Это предложение, кстати - подключиться и помочь удаленно - относится и ко всем остальным, кто рано или поздно попадет в этот тред/обсуждение (через поиск или еще как).
Комментариев нет:
Отправить комментарий