JDBC подготовил оператор с большими столбцами, что не вызывает проблем с производительностью. Как инструменты ETL обходят эту проблему? - PullRequest
0 голосов
/ 25 июня 2018

В основном это парень из БД, который не использовал Java для массовой загрузки и т. Д., Как это было сделано с помощью инструментов ETL или внутренних инструментов БД.

Но если я правильно понимаю, инструменты написаны на Java / C ++ и т. Д., И они используют JDBC, ODBC для реализации операции.

Недавно в одном проекте пытались загрузить объемные данные с использованием JDBC и наблюдали следующее.

у нас есть миллион записей, 1,5 ГБ данных, таблица с 360 столбцами. Чтение из таблицы A и попытка вставить ее в целевую таблицу с интервалом 5 тыс. Записей. исходная цель и цель - Oracle.

В проекте используется Spring JDBC. Я использовал здесь простой JDBC для тестирования в одиночку и устранения проблем с производительностью. логика описана на псевдоязыке.

prepare statement for Target with 
"insert into target values ( ?,?, .. 368 columns);
rs = (  select * from table a );
while rs.next {
  stmt.setstring(1, rs.getString("column1");
 .
 .
 360 columns.
 stmt.add_batch();

 if 5K records then executeBatch();
}

Основной выпуск:

для каждых 5K-записей набор операторов занимает более 1 минуты.

, поэтому загрузка всего 1,5 Гб или 1 млн. Записей займет ок. 4 часа.

Я делаю это одним потоком, но чувствую, что громкость очень низкая. Есть ли лучший способ реализовать это?

Как инструменты ETL говорят, что informatica и т. Д. Реализуются внутренне?

Другая проблема заключается в следующем: иногда executeBatch() для некоторой таблицы с аналогичным количеством столбцов и большим объемом в каждой записи записывать 5 тыс. Записей за один раз. В некоторых случаях он записывает 100 записей за один раз, хотя executeBatch - после 5 тыс. Строк, и запись также занимает вечность для 1 миллиона записей.

Еще одна вещь вместо набора результатов, если я использую операторы set как

for (I=1 ,I<=1000000; I++)
  stmt.setstring(1, rs.getString("123456789");--hardcode value
    .
    .
    360 columns.
   stmt.add_batch();
  if 5K records then executeBatch();
}

затем требуется около 4 секунд для привязки каждые 5k и 2-3 секунды до executeBatch(). Таким образом, за 20 минут я могу загрузить 1 миллион около 6-7 ГБ данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...