Задать вопрос
@AntoXa_ZiMM
I just write code and do not know English

Вставка в бд огромного объема данных, как лучше сделать?

Есть проблема с вставкой в бд огромного объёма данных, а именно:
1 данные парятся из xml файлов разного размера (от мегабайта до 50+ гигабайт) по определенным правилам
2 каждый файл обрабатывается в основном потоке(если они небольшие -- запускаются параллельно несколько)
3 после того как файл распарсили -- конкатенацией строк пишем SQL скрипт типа:
insert into schema.table values... по 1000 строк за запрос для каждого файла получается один или несколько скриптов
4 в таблицах бд вообще нету индексов или primary key, т.е. поиск дубликатов в момент вставки каждой строки занимает огромное кол-во времени (я пробовал, на это больно смотреть)
5 после того как все данные вставились начинается удаление дубликатов по двум столбцам (один должен быть уникальным в рамках таблицы, второй типа timestamp время начало обработки пакета данных) -- создаю временную таблицу из двух столбцов, записываю в неё актуальные данные, все, что не в ней -- вытираю из бд
6 изменение бд, транзакции запрещены т.к. с бд одновременно работают несколько приложений

Как реализовать это быстро и качественно, сил уже нету, есть идеи, но целостного и стабильного решения нету, так чтоб и бд не сломать(скриптов много создаётся, мало ли что там нагнется в какой момент) и работало все не дни, а максимально быстро и желательно в минутах?

ИЗМЕНЕНИЕ ИСХОДНОЙ ЗАДАЧИ:
5 Уникальность записи определяется 2мя столбцами в БД, один из них хэш значения в исходном xml, второй -- время начала обработки данных, двух строк с этими одинаковыми полями в таблице быть не должно
6 Добавление индексов, ключей и транзакции по прежнему запрещены, но создавать временные таблицы с любыми наборами индексов и полей можно (и это просто отлично)

РЕШЕНИЕ
Т.к. несколько приложений могут работать с БД (могут быть реплики разрабатываемого приложения или совершенно другое приложение может работать с интересующей нас базой) по прежнему не можем использовать транзакции, дописывать в имеющиеся в БД таблицы индексы или хитрые ключи по нескольким столбцам.
Можно создать временные таблицы в БД, влить в них абсолютно все данные из xml, потом дописать индексы для временных таблиц, потереть дубликаты, слить данные в основные таблицы, удалить временные таблицы, повторять для каждого нового пакета данных
  • Вопрос задан
  • 349 просмотров
Подписаться 1 Оценить 7 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы