Spring Batch SQL Merge prend trop de time

J'essaie de migrer des données d'une database Oracle vers SQL Server. J'utilise actuellement un JDBCCursorItemReader pour lire datatables Oracle, puis un JDBCBatchItemWriter pour écrire datatables dans SQL Server.

Mon problème est que cela prend trop de time. Pour une table de ~ 200 000 lignes, cela prend presque une heure (et je dois exécuter quatre de ces requêtes, chacune d'environ 200K de lignes).

@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; } 

Quelqu'un a-t-il des conseils pour améliorer les performances sur ces types d'emplois?

Quelqu'un a-t-il des conseils pour améliorer les performances sur ces types d'emplois?

Je voudrais aborder de cette façon ..

1.Voir les statistics d'attente pour le process que je cours

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

Pour identifier votre sessionid, vous pouvez vérifier 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 basé sur le type d'attente ..

Je voudrais d'abord insert vos loggings à une table source (personnellement, j'utiliserais une table temporaire) et puis tirer parti de la command MERGE pour pousser les loggings de cette table "source" dans votre table "cible".

Un couple key de performance concerne:

  • Assurez-vous de faire correspondre une key indexée sur votre table cible
  • En supposant que vous souhaitez mettre à jour les lignes MATCHED, ne mettez PAS à jour les colonnes d'index dans le cadre de votre instruction UPDATE
  • Réglez décemment votre intervalle de validation. Votre database devrait être capable de merge 1000 lignes sans faire de sueur. Commettre trop souvent appenda des frais généraux importants.

Maintenant, pour accomplir cela avec Spring Batch, vous aurez probablement besoin d'un ItemWriter composite (un sort de la boîte avec le framework). Le rédacteur délégué 1 serait le JdbcBatchItemWriter vous utilisez déjà et serait inséré dans cette table source. Le rédacteur délégué 2 serait personnalisé et exécuterait simplement votre command MERGE .