2016-09-16 2 views
2

Я пытаюсь перенести данные из базы данных Oracle в SQLServer. В настоящее время я использую JDBCCursorItemReader для чтения данных Oracle, а затем JDBCBatchItemWriter для записи данных на SQL-сервер.Весенний пакетный слияние SQL слишком длинный

Моя проблема заключается в том, что это слишком долго. Для таблицы из 200 000 строк требуется почти час (и я должен выполнить четыре из этих запросов, каждый около 200 тыс. Строк).

@Bean 
public JdbcCursorItemReader<DataPOJO> dataReader() throws Exception, ParseException, UnexpectedInputException { 
     final JdbcCursorItemReader<DataPOJO> dataReader= new JdbcCursorItemReader<>(); 

     dataReader.setDataSource(oracleDataSource); 
     dataReader.setSql(Constants.DATA_QUERY); 
     dataReader.setRowMapper(new BeanPropertyRowMapper<DataPOJO>(DataPOJO.class)); 
     return dataReader; 
    } 

@Bean 
    public JdbcBatchItemWriter<DataPOJO> dataWriter() throws UnexpectedInputException, ParseException, Exception { 

     JdbcBatchItemWriter<DataPOJO> dataWriter = new JdbcBatchItemWriter<>(); 
     dataWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<DataPOJO>()); 
     dataWriter.setSql(Constants.DATA_MERGE); 
     dataWriter.setDataSource(mssDataSource); 
     return dataWriter; 
    } 

Есть ли у кого-нибудь советы по улучшению производительности на этих видах работ?

+0

Это выглядит определенно как проблема с db. Сколько времени займет запрос Select-Query, если вы запустили его непосредственно в браузере sql/db? Кроме того, вы установили autoocommit в false? Что такое commitSize вашего шага? Как правило, вы должны иметь возможность читать и писать пару тысяч записей в секунду. –

ответ

0

Есть ли у кого-нибудь какие-либо советы по повышению производительности на этих видах работ?

Я бы подходить таким образом ..

1.See статистика ожидания для процесса я бегу

select * from sys.dm_exec_requests where session_id=<< your session id>> 

Для идентификации SessionID, вы можете проверить sys.processes

select spid,waittime,lastwaittype,status 
hostname,  --below three columns help you identify your query/spid, 
program_name,--- you can replace spid in above query to get live status 
nt_username 
from sys.sysprocesses 

2.Troubleshoot в зависимости от типа ожидания ..

0

Я бы ввел свои записи в исходную таблицу (лично, я бы использовал временную таблицу), а затем использовал команду MERGE, чтобы вытащить записи из этой «исходной» таблицы в вашу «целевую» таблицу.

несколько ключевых проблем производительности:

  • Убедитесь вы подходите на индексированной ключ на целевой таблице
  • Предполагая, что вы хотите обновить совпавшие строки, не обновлять индекс столбца (ы) в качестве части вашего UPDATE
  • Установите уровень фиксации достаточно прилично. Ваша БД должна иметь возможность объединить 1000 строк, не разбивая пота. Слишком частое обязательство добавит значительные накладные расходы.

Теперь, чтобы выполнить это с помощью Spring Batch, вам, вероятно, понадобится составной ItemWriter (один из них выходит из коробки с каркасом). Делегат-писатель 1 будет JdbcBatchItemWriter, который вы уже используете, и будет вставляться в эту исходную таблицу. Делегат-писатель 2 был бы обычным и просто выполнил бы команду MERGE.

Смежные вопросы