#mysql #sql #база_данных #sql_server
Есть задача, загрузить в таблицу миллион строк, фейковых данных. Интересует следующий вопрос, какие могут быть подходы к данной задаче, в общем, без привязки к типу базы данных, к примеру, одна умеет получать на вход csv файл, друга нет, но сам подход существует, можно написать процедуру, можно bash скрипт. Подскажите кто какой путь знает.
Ответы
Ответ 1
Хороший вопрос! К сожалению, я не знаю элегантного и простого ответа на этот вопрос. По непонятным мне причинам до сих пор не существует единого SQL стандарта для быстрой загрузки данных. Во всяком случае я такой стандарт найти не смог. Практически все серьезные RDBMS (СУБД) системы имеют свой (несовместимый с другими) способ для быстрой загрузки данных (смотрите ссылки ниже). Можно попробовать написать "адаптер" для каждой СУБД, использующий "bulk load / insert" решение данной СУБД. Т.е создать адаптеры для каждой СУБД, которую вы хотите поддерживать в своем приложении или использовать универсальный и наивный (медленный) подход вставки по одной строке... Известные мне инструменты для быстрой загрузки данных для нескольких популярных СУБД: Oracle: External Tables - используя внешние таблицы, можно просто вставлять данные в другую таблицу (используя direct-path insert): insert /*+append*/ into target_table select * from source_external_table; PS Direct-path INSERT "откатится" к обычному conventional INSERT если хотя бы одно условие (см. ссылку выше) не будет выполнено Данное решение работает достаточно быстро и позоляет "распараллелить" задачу по нескольким узлам кластера (Real Application Cluster), если секционировать данные и распределить файлы на разных узлах кластера. PL/SQL Bulk Collect (Пример использования) SQL Loader SQL Server: Bulk Copy Program utility AKA BCP Bulk Insert MySQL: LOAD DATA INFILE Bulk Data Loading for InnoDB Tables PostgreSQL: COPY PS @root_xPovierennyy напомнил об очень важном аспекте - индексах: Если у вас есть такая возможность и если это целесообразно то сделайте следующее для ускорения загрузки: удалите все индексы целевой таблицы удалите все "referential constraints", связанные с целевой таблицей удалите все тригеры целевой таблицы пересоздайте, если это необходимо, удаленные объекты. Не забудьте пересобрать статистику для целевой таблицы, особенно если значительная часть данных была изменена. В любом случае надо протестировать и выбрать наиболее подходящее именно для вас решение.Ответ 2
Возьмите любой язык программирования, коннектор к базе для этого языка, напишите код: # псевдокод база = коннектор.создать_соединение(адрес@имябазы) курсор = база.создать_курсор() количество_фейков = 1000000 размер_пачки = 10000 х = 0 цикл пока х < количество_фейков { пачка = пустой_список у = 0 цикл пока у < размер_пачки { пачка.добавить(сгенерировать_фейковую_строку()) у = у + 1 } курсор.добавить(пачка) курсор.сделать_коммит() х = х + 1 } курсор.закрыть_курсор() база.закрыть_соединение()Ответ 3
Если речь идёт именно о более-менее общем способе загрузить данные без оглядки на скорость этого процесса, то, как мне кажется, надо посмотреть в сторону XML, этот формат понимают (с той или иной степенью вменяемости этого понимания - но с плоскими файлами проблем именно понимания нет) все популярные СУБД. А генерить фэйк в общем всё равно в каком формате, XML тут ничем не хуже многих прочих, тем более что во избежание проблем, связанных с пониманием структур и схем разными СУБД, желательно готовить фэйк в простейшем формате (одна таблица - один XML для загрузки). Правда, и тут попадаются свои заморочки, совсем разного масштаба, от забавных казусов и вплоть до нерешаемых проблем. К последним, например, можно отнести проблему загрузки сверхбольших XML-файлов в MySQL (исчерпание памяти и снятие загружающего процесса - хорошо хоть при этом сервер не падает).
Комментариев нет:
Отправить комментарий