Самый быстрый способ сбросить все большие двоичные объекты в PL/SQL

#plsql #blob

Вопрос:

Я пытаюсь выгрузить все большие двоичные объекты в большой таблице в файловую систему. Стол похож на:

 
Name                   Null?    Type          
---------------------- -------- ------------- 
ID                     NOT NULL NUMBER(19)    
FILENAME               NOT NULL VARCHAR2(256) 
OFFSET_BLOB                     BLOB          
 

Мне нужно сбросить все OFFSET_BLOB файлы в файловую систему в именованных файлах [filename].offsets .

Мой текущий подход заключается в создании хранимой процедуры, которая выполняет итерацию по всем строкам, а затем использует UTL_FILE.put_raw() для записи данных в файл. Это работает нормально, но в таблице более 250 миллионов строк, и текущая оценка должна занять 5 дней для завершения. Я попытался добавить параллельные подсказки в запрос с /* ПОЛНАЯ ПАРАЛЛЕЛЬ(10)*/, но это ничего не улучшает :(.

У кого-нибудь из вас есть лучший подход, чтобы резко сократить время извлечения до нескольких часов вместо нескольких дней? Спасибо!

Комментарии:

1. Кажется, что лучшего решения не существует. Просто дайте ему уйти и продолжайте, сколько бы времени это ни заняло. С положительной стороны, поскольку вы не обновляете таблицы, это не будет мешать другой обработке базы данных, кроме выполнения циклов процессора и операций ввода-вывода. Но, возможно, вам нужно взглянуть реалистично; вы действительно хотите создать 250 миллионов файлов в файловой системе? Или поместить 250 миллионов неопознанных больших двоичных объектов в 1 файл ?

2. Параллельный запрос не поможет, потому что медленен не сам запрос , а запись больших двоичных объектов. Проверьте dbms_parallel_execute, который позволит вам запускать несколько экспортеров одновременно.