#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, который позволит вам запускать несколько экспортеров одновременно.