=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsTableManager.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsTableManager.java 2012-12-22 17:51:57 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsTableManager.java 2012-12-22 18:09:46 +0000 @@ -119,4 +119,12 @@ * @param aggregationLevel the aggregation level. */ void applyAggregationLevels( String tableName, Collection dataElements, int aggregationLevel ); + + /** + * Performs vacuum or optimization of the given table. The type of operation + * performed is dependent on the underlying DBMS. + * + * @param tableName the name of the analytics table. + */ + Future vacuumTableAsync( String tableName ); } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/DefaultAnalyticsTableService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/DefaultAnalyticsTableService.java 2012-12-22 17:51:57 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/DefaultAnalyticsTableService.java 2012-12-22 18:09:46 +0000 @@ -98,6 +98,9 @@ createIndexes( tables ); clock.logTime( "Created all indexes" ); + vacuumTables( tables ); + clock.logTime( "Vacuumed tables" ); + swapTables( tables ); clock.logTime( "Swapped analytics tables" ); @@ -120,11 +123,7 @@ private void populateTables( List tables ) { - int pageSize = Math.max( ( SystemUtils.getCpuCores() - 1 ), 1 ); - - log.info( "Page size: " + pageSize ); - - List> tablePages = new PaginatedList( tables ).setPageSize( pageSize ).getPages(); + List> tablePages = new PaginatedList( tables ).setPageSize( getProcessNo() ).getPages(); log.info( "No of pages: " + tablePages.size() ); @@ -177,17 +176,30 @@ } } + private void vacuumTables( List tables ) + { + List> tablePages = new PaginatedList( tables ).setPageSize( getProcessNo() ).getPages(); + + for ( List tablePage : tablePages ) + { + List> futures = new ArrayList>(); + + for ( String table : tablePage ) + { + futures.add( tableManager.vacuumTableAsync( table ) ); + } + + ConcurrentUtils.waitForCompletion( futures ); + } + } + private void createIndexes( List tables ) { - int pages = Math.max( ( SystemUtils.getCpuCores() - 1 ), 1 ); - - log.info( "No of pages: " + pages ); - for ( String table : tables ) { List> futures = new ArrayList>(); - List> columnPages = new PaginatedList( tableManager.getDimensionColumnNames() ).setNumberOfPages( pages ).getPages(); + List> columnPages = new PaginatedList( tableManager.getDimensionColumnNames() ).setNumberOfPages( getProcessNo() ).getPages(); for ( List columnPage : columnPages ) { @@ -213,4 +225,9 @@ tableManager.dropTable( table ); } } + + private int getProcessNo() + { + return Math.max( ( SystemUtils.getCpuCores() - 1 ), 1 ); + } } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcAnalyticsTableManager.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcAnalyticsTableManager.java 2012-12-22 17:51:57 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcAnalyticsTableManager.java 2012-12-22 18:09:46 +0000 @@ -41,6 +41,7 @@ import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.dataelement.DataElementGroupSet; import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.jdbc.StatementBuilder; import org.hisp.dhis.organisationunit.OrganisationUnitGroupService; import org.hisp.dhis.organisationunit.OrganisationUnitGroupSet; import org.hisp.dhis.organisationunit.OrganisationUnitLevel; @@ -89,6 +90,9 @@ private OrganisationUnitGroupService organisationUnitGroupService; @Autowired + private StatementBuilder statementBuilder; + + @Autowired private JdbcTemplate jdbcTemplate; // ------------------------------------------------------------------------- @@ -340,7 +344,19 @@ log.info( "Aggregation level SQL: " + sql.toString() ); jdbcTemplate.execute( sql.toString() ); - } + } + + @Async + public Future vacuumTableAsync( String tableName ) + { + final String sql = statementBuilder.getVacuum( tableName ); + + log.info( "Vacuum SQL:" + sql ); + + jdbcTemplate.execute( sql ); + + return null; + } // ------------------------------------------------------------------------- // Supportive methods === modified file 'dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/MySQLStatementBuilder.java' --- dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/MySQLStatementBuilder.java 2012-10-29 11:18:39 +0000 +++ dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/MySQLStatementBuilder.java 2012-12-22 18:09:46 +0000 @@ -44,7 +44,7 @@ @Override public String getVacuum( String table ) { - return null; + return "optimize table " + table + ";"; } @Override