#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 и тд и тп. Главное начать и выяснить, что оптимизировать или где затык. А дальше уже дело техники. Если есть такая физическая/юридическая возможность + необходимость в предлагаемом - если Вы можете предоставить удаленный доступ - с удовольствием помогу решить (или хотя бы "осмотреть наружно" / применить озвученные выше рекомендации) текущую задачку "физически", бо интересный случай + имею предыдущий опыт в решении похожих ситуаций, когда перекачка данных в гетерогенных средах ведет себя не так, как ожидается. Это предложение, кстати - подключиться и помочь удаленно - относится и ко всем остальным, кто рано или поздно попадет в этот тред/обсуждение (через поиск или еще как).
Комментариев нет:
Отправить комментарий