2016-09-16 5 views
2

OracleからSQLServerデータベースへデータを移行しようとしています。私は現在、JDBCCursorItemReaderを使用してOracleデータを読み取り、次にJDBCBatchItemWriterを使用してSQL Serverにデータを書き込みます。SpringバッチSQLマージが長すぎます

私の問題は、これが長すぎます。約200,000行のテーブルの場合、それは約1時間かかります(そして、これらのクエリのうち、それぞれ200K行のうちの4つを実行する必要があります)。

@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ブラウザで直接実行されるまでに、どのくらい時間がかかりますか?さらに、自動コミットをfalseに設定しましたか?あなたのステップのコミットは何ですか?一般的に、毎秒数千ものエントリを読み書きすることができます。 –

答えて

0

これらの種類のジョブのパフォーマンスを改善するヒントはありますか?私はこのように接近するでしょう

..

1.See私はあなたのセッションIDを識別するために

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

を実行しているプロセスの待機統計、あなたは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.待機タイプに基づいたトラブルシューティング

0

私は最初に自分のレコードをソーステーブルに挿入します(個人的には、一時テーブルを使用します)。MERGEコマンドを利用して、その "ソース"テーブルのレコードを "ターゲット"テーブルにプッシュします。

カップルの主要なパフォーマンス上の問題:

  • あなたは、あなたが一致したレコードを更新したいと仮定すると、ターゲット表
  • 上のインデックス付きのキーに一致する部分としてインデックス列(複数可)を更新しないことを確認してくださいUPDATEステートメント
  • コミット間隔を少し高く設定してください。あなたのDBは、汗をかくことなく1000行をマージできる必要があります。あまりに頻繁にコミットすると、大幅なオーバーヘッドが発生します

これをSpring Batchで実現するには、おそらくコンポジットItemWriterが必要です(このフレームワークはすぐに出荷されます)。デリゲートライター1はすでに使用しているJdbcBatchItemWriterで、そのソーステーブルに挿入されます。デリゲートライター2はカスタムで、単にMERGEコマンドを実行します。

関連する問題