Вставка в бд огромного объема данных, как лучше сделать?
Есть проблема с вставкой в бд огромного объёма данных, а именно:
1 данные парятся из xml файлов разного размера (от мегабайта до 50+ гигабайт) по определенным правилам
2 каждый файл обрабатывается в основном потоке(если они небольшие -- запускаются параллельно несколько)
3 после того как файл распарсили -- конкатенацией строк пишем SQL скрипт типа:
insert into schema.table values... по 1000 строк за запрос для каждого файла получается один или несколько скриптов
4 в таблицах бд вообще нету индексов или primary key, т.е. поиск дубликатов в момент вставки каждой строки занимает огромное кол-во времени (я пробовал, на это больно смотреть)
5 после того как все данные вставились начинается удаление дубликатов по двум столбцам (один должен быть уникальным в рамках таблицы, второй типа timestamp время начало обработки пакета данных) -- создаю временную таблицу из двух столбцов, записываю в неё актуальные данные, все, что не в ней -- вытираю из бд
6 изменение бд, транзакции запрещены т.к. с бд одновременно работают несколько приложений
Как реализовать это быстро и качественно, сил уже нету, есть идеи, но целостного и стабильного решения нету, так чтоб и бд не сломать(скриптов много создаётся, мало ли что там нагнется в какой момент) и работало все не дни, а максимально быстро и желательно в минутах?
ИЗМЕНЕНИЕ ИСХОДНОЙ ЗАДАЧИ:
5 Уникальность записи определяется 2мя столбцами в БД, один из них хэш значения в исходном xml, второй -- время начала обработки данных, двух строк с этими одинаковыми полями в таблице быть не должно
6 Добавление индексов, ключей и транзакции по прежнему запрещены, но создавать временные таблицы с любыми наборами индексов и полей можно (и это просто отлично)
РЕШЕНИЕ
Т.к. несколько приложений могут работать с БД (могут быть реплики разрабатываемого приложения или совершенно другое приложение может работать с интересующей нас базой) по прежнему не можем использовать транзакции, дописывать в имеющиеся в БД таблицы индексы или хитрые ключи по нескольким столбцам.
Можно создать временные таблицы в БД, влить в них абсолютно все данные из xml, потом дописать индексы для временных таблиц, потереть дубликаты, слить данные в основные таблицы, удалить временные таблицы, повторять для каждого нового пакета данных
Потому что заказчик. Извиняюсь за тупой ответ, но увы -- заказчик использует много разных бд для хранения и обработки данных на разных этапах работы системы и это самая первая из них, туда просто вливаются данные как есть, но обязательно без дубликатов, потом он их забирает в другую бд (и, думаю, там уже начинаются ключи, индексы, один комоним и т.д.)
Пропатчить не вариант т.к. доступа к проекту бд нету, да и накажут меня за это больно, создать свои временные pk не получится т.к. не уверен в консистентности данных (может дубликаты кто-то другой вставил уже), индексы временно вставлять в основные таблицы тоже не вариант т..к. при построении блокируют таблицу/бд пока строятся
SaNNy32: это не глупо, это такая архитектура БД (возможно кривовата, возможно требования прикладной части, а скорее всего оба пункта) и невозможность её изменить. БД с данными и их там миллионы строк, за один цикл обработки стандартного пакета данных только в одну таблицу из 50 вставляется около 243 000 строк.
Индексировать не вариант т.к. исходная таблица без индексов и должна такой остаться, если пересоздавать индексы при каждой обработке данных -- время этой операции будет увеличиваться с каждым циклом обработки данных, транзакции использовать запрещено