Sobes.tech
Back to questions
Junior
13

Как ускорить вставку 100 миллиардов записей в БД? Сейчас: цикл с generate + insert + commit на каждую строку.

Companies where asked
ИП Ганус Александр Андреевич

Answer from AI

sobes.tech AI

Чтобы ускорить вставку 100 миллиардов записей в базу данных, нужно отказаться от вставки по одной записи с коммитом на каждую строку. Это очень медленно из-за накладных расходов на транзакции и сетевые операции.

Основные подходы:

  • Использовать пакетные вставки (batch insert), группируя записи по несколько тысяч или десятков тысяч за один запрос.
  • Отключить индексы и триггеры на время загрузки, чтобы не тратить ресурсы на обновление индексов.
  • Использовать bulk load инструменты, если СУБД их поддерживает (например, COPY в PostgreSQL, LOAD DATA INFILE в MySQL).
  • Отключить автокоммит и делать коммит после вставки больших батчей.
  • Параллелить загрузку, если позволяет архитектура и СУБД.

Пример на псевдокоде:

connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement("INSERT INTO table (col1, col2) VALUES (?, ?)");
int batchSize = 10000;
int count = 0;
for (Record r : records) {
    ps.setString(1, r.getCol1());
    ps.setString(2, r.getCol2());
    ps.addBatch();
    if (++count % batchSize == 0) {
        ps.executeBatch();
        connection.commit();
    }
}
ps.executeBatch();
connection.commit();

Такой подход значительно ускорит загрузку данных.