I am extending this question Spring Batch Performance issue when run two independent jobs sequentially? further here:
We're seeing behavior of Postgres v9.6 where we're trying to save the data having null values using Batch updates taking a very long time to save the data.
Is there any way if we can fixed it either from database side or from Spring Boot side ?
Sample Query -
"INSERT INTO test.ACCT "
+ "(rec_type, acct_type_cd, src_acct_id, stat_cd,stat_dttm, ........, "
+ "..................) "
+ "VALUES(?, ? , ?, )";
Note - For security reasons can't add column name as is.
We've the table details and query like below
- has a large proportion of NULLs in several columns
- receives a large number of UPDATEs or DELETEs regularly
- is not growing rapidly
- has no indexes on it.
- not uses any triggers that may be executing database functions, or is calling functions directly
Total no. of rows we're inserting in batches are 40K and in the chunk of 2500 records. Code List<Map<String, Object>>
batchValues = new ArrayList<>(items.size());
for(Employee emp: items) {
batchValues.add(new MapSqlParameterSource()
.addValue("", emp.getXXXXX() == null ? "": emp.getXXXXX(), JDBCType.VARCHAR.getVendorTypeNumber())
.addValue("", emp.getXXXXX() == null ? "": emp.getXXXXX(), JDBCType.VARCHAR.getVendorTypeNumber())
.addValue("", emp.getXXXXX() == null ? "": emp.getXXXXX() , JDBCType.VARCHAR.getVendorTypeNumber())
.addValue("", emp.getXXXXX() == null ? "": emp.getXXXXX(), JDBCType.VARCHAR.getVendorTypeNumber())
.addValue("", emp.getXXXXX(), JDBCType.DATE.getVendorTypeNumber())
.addValue("", emp.getXXXXX()== null ? "": emp.getXXXXX(), JDBCType.VARCHAR.getVendorTypeNumber())
.addValue("", emp.getXXXXX() == null ? "": emp.getXXXXX(), JDBCType.VARCHAR.getVendorTypeNumber())
.addValue("", emp.getXXXXX() == null ? "": emp.getXXXXX(), JDBCType.VARCHAR.getVendorTypeNumber())
........
........
........
........
.getValues());
}
try {
int[] updateCounts = namedJdbcTemplate.batchUpdate(SQL, batchValues.toArray(new Map[items.size()]));
} catch (Exception e) {
log.error("Error occurred in BatchUpdate ##");
throw new GenericException(e.getMessage(),this.getClass().getSimpleName());
}
batch Jobs are running sequential, first is truncate (which is fast) and other insert in batches (having more null values) eating up the performance.