Я бы полностью избегал построчной обработки, потому что она всегда значительно медленнее, чем альтернативный подход, основанный на наборах, для такого рода проблем. , это самый быстрый способ, если скорость является наиболее важным фактором. Но иногда другие соображения важнее скорости.
Рассмотрите возможность изменения вашей хранимой процедуры, чтобы использовать подход, основанный на наборах.
Если одного запроса (соединение нескольких таблиц) достаточно, чтобы указать окончательный результирующий набор (для вашего table_C
вам не нужны промежуточные таблицы, и вы можете рассмотреть либо с использованием незарегистрированной загрузки для заполнения итоговой таблицы (см. Ниже) или простая записанная в журнал вставка.
Если для обработки требуется одна или несколько промежуточных таблиц для создания окончательного набора результатов, одним из вариантов является создание одного или нескольких not logged
DGTT (объявление глобальной временной таблицы) в хранимой процедуре , структура которого соответствует итоговой таблице (TABLE_ C в вашем вопросе). Вы можете использовать on commit preserve rows
для DGTT, если для его заполнения необходимо несколько единиц работы (например, несколько insert
, update
, delete
, merge
операторы необходимы).
Затем заполните эту таблицу сеанса, используя SQL, избегая построчной обработки (не используйте курсоры для заполнения DGTT используйте обработку множеств, например insert into session.xxxx (...) select...
или merge
et c. ). Вы можете использовать столько операторов, сколько необходимо для заполнения сеансовой таблицы и фиксации, сколько необходимо для снятия любых блокировок.
Сжать DGTT, если это необходимо. Разделите DGTT (ha sh), если это необходимо. Динамически индексируйте DGTT, если это необходимо, и запускайте его. Все это возможно внутри хранимой процедуры.
Когда вы убедитесь, что содержимое DGTT верное, вы готовы заполнить итоговую таблицу.
Помните, вам нужен только DGTT, если вы действительно необходимо этап набор результатов или выполнить дополнительную обработку или проверки перед записью окончательной таблицы (table_ c) в вашем примере.
Чтобы заполнить окончательную таблицу (либо из исходного источника таблицы с одним объединением нескольких таблиц или из DGTT, на котором вы выполнили любую требуемую обработку), вы можете либо использовать команду unlogged load
через хранимую процедуру ADMIN_CMD (если ваш Db2 -серверная платформа поддерживает эту функцию), или вы можете использовать (гораздо медленнее) INSERT INTO TABLE_C(...) SELECT ... FROM...
. С записанной вставкой, в зависимости от доступной емкости ваших журналов транзакций, вам может потребоваться выполнить этот шаг в пакетном режиме.
Чтобы использовать load
(через admin_cmd () ), необходимо тщательно продумать и планирования, и требует понимания проблем и вовлеченных компромиссов, поэтому внимательно изучите документацию или привлеките для работы опытного программиста.
Это решение требует навыков программирования, компетентности и опыта.