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();
});