2017-07-20 7 views
1

Ich beziehe mich auf diese Dokumentation. http://www-01.ibm.com/support/docview.wss?uid=swg21981328. Laut dem Artikel, wenn wir die executeBatch-Methode verwenden, sind Einfügungen schneller (Der Netezza-JDBC-Treiber erkennt möglicherweise eine Batch-Einfügung, und unter den Deckblättern wird dies in eine externe Tabellenladung konvertiert und die externe Tabellenladung wird schneller). Ich musste Millionen von Insert-Anweisungen ausführen, und ich bekomme nur eine Geschwindigkeit von 500 Datensätzen pro Minute pro Verbindung max. Gibt es eine bessere Möglichkeit, Daten schneller über die jdbc-Verbindung in netezza zu laden? Ich verwende Spark und JDBC-Verbindung, um die Datensätze einzufügen.Warum externe Tabelle über Laden ist nicht passiert, auch wenn ich in Batches ausführe. Da unten ist der Funke Code ich verwende,Netezza Batch Insert ist selbst im Batch-Ausführungsmodus sehr langsam

Dataset<String> insertQueryDataSet.foreachPartition(partition -> {     
    Connection conn = NetezzaConnector.getSingletonConnection(url, userName, pwd); 
    conn.setAutoCommit(false); 
    int commitBatchCount = 0; 
    int insertBatchCount = 0; 
    Statement statement = conn.createStatement(); 
    //PreparedStatement preparedStmt = null; 
    while(partition.hasNext()){ 
     insertBatchCount++;    
     //preparedStmt = conn.prepareStatement(partition.next()); 
     statement.addBatch(partition.next()); 
     //statement.addBatch(partition.next()); 
     commitBatchCount++; 
     if(insertBatchCount % 10000 == 0){ 
      LOGGER.info("Before executeBatch.");        
      int[] execCount = statement.executeBatch(); 
      LOGGER.info("After execCount." + execCount.length);      
      LOGGER.info("Before commit."); 
      conn.commit();       
      LOGGER.info("After commit.");             
     }      
    } 
    //execute remaining statements 
    statement.executeBatch(); 
    int[] execCount = statement.executeBatch(); 
    LOGGER.info("After execCount." + execCount.length); 
    conn.commit();   
    conn.close(); 

}); 

Antwort

0

ich diesen Ansatz versucht (Batch-Einsatz) fand aber sehr langsam, Also habe ich alle Daten in CSV & tun Last externe Tabelle für jeden csv.

InsertReq="Insert into "+ tablename + " select * from external '"+ filepath + "' using (maxerrors 0, delimiter ',' unase 2000 encoding 'internal' remotesource 'jdbc' escapechar '\')"; 
Jdbctemplate.execute(InsertReq); 

Da ich java so JDBC als Quelle & beachten Sie, dass CSV-Datei-Pfad ist in einfache Anführungszeichen verwendet wurde. Hoffe, das hilft. Wenn Sie besser als dieser Ansatz finden, vergessen Sie nicht zu posten. :)