2012-05-24 6 views
0

Я хочу оптимизировать производительность этого SQL-запроса. Если я заполню эту хэш-таблицу одним миллионом ключей, запрос займет около минуты. Как я могу оптимизировать этот Java-метод для более быстрого выполнения?Как оптимизировать этот SQL-запрос

private HashMap<String, Boolean> selectedIds = new HashMap<>(); 

public void deleteSelectedIDs() throws SQLException { 

     if (ds == null) { 
      throw new SQLException(); 
     } 

     Connection conn = ds.getConnection(); 
     if (conn == null) { 
      throw new SQLException(); 
     } 

     PreparedStatement ps = null; 
     ResultSet resultSet = null; 

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
      try { 
       String sqlDeleteQuery = "DELETE FROM ACTIVESESSIONSLOG WHERE ASESSIONID = ?"; 

       Set<String> keySet = selectedIds.keySet(); 
       String[] keys = new String[]{}; 
       keys = selectedIds.keySet().toArray(keys); 
       ps = conn.prepareStatement(sqlDeleteQuery); 

       for (int i = 0; i < keys.length; i++) { 
        if (selectedIds.get(keys[i]).booleanValue()) { 
         ps.setString(1, keys[i]); 
         ps.executeUpdate(); 
         ps.clearParameters(); 
         selectedIds.put(keys[i], false); //get(keys[i]) = false; 
        } 
       } 

       conn.commit(); 
       committed = true; 

       //selectedIds.clear(); 
      } finally { 
       if (!committed) { 
        conn.rollback(); 
       } 
      } 
     } finally { 
      ps.close(); 
      conn.close(); 
     } 
    } 
+1

вы хотите оптимизировать оператор SQL или программу Java ли? Если это SQL-запрос, откуда вы знаете, что это медленная часть? У вас было время? Если да, то каков план выполнения? –

+0

Я хочу оптимизировать все. – user1285928

+2

Вам нужно получить идентификаторы на Java? Вы можете вычислить набор идентификаторов в SQL и выполнить полную операцию там? И миллион SQL-поездок за минуту очень хорош! в противном случае вы могли бы попытаться выполнить докетирование идентификаторов в 50 слов на SQL-оператор, используя 'WHERE ASESSIONID IN (?,?, ..' и т. д. – Rup

ответ

5

Если драйвер JDBC поддерживает его, используйте batch processing. Он прост в использовании и имеет тенденцию работать очень хорошо для этого типа сценариев.

+0

Это Java-сервер Приложение Faces, размещенное на сервере Glassfish. Я не знаю, поддерживается ли это. – user1285928

+1

Я согласен, что допуск пакета - это путь –

+1

У него уже есть фиксация после всех вызовов, поэтому я не думаю, что это wi Много помогу. –

3

У кого-то может быть лучшая идея, но вы рассмотрели возможность передачи списка ключей Oracle через временную таблицу, а затем выполнения цикла в PL/SQL-функции. Это уменьшит трафик, и БД выполнит обработку.

2

Создайте временную таблицу и вставьте туда все идентификаторы. Затем выполните одно удаление для найденных во временной таблице.

2

Я думаю, что было бы лучше использовать CallableStatement и оракул procedure.

Отрывок

SQL> create type temp_tbl 
    2 is 
    3 table of number; 
    4/

... 


SQL> create or replace procedure stored_p 
    2 (
    3 list in temp_tbl, 
    4 p_rc out sys_refcursor) 
    5 as 
    6 begin 
    7 open 
    8 p_rc for delete from ACTIVESESSIONSLOG where ASESSIONID 
     in (select * from table(list)); 
    9 end; 
10/
+0

Почему - как решить проблему передачи всех идентификаторов в базу данных? Почему это было бы лучше, чем подготовленные заявления? – Rup

+0

создайте временную таблицу в соответствии с вашей коллекцией и удерживайте данные в таблице и удалите данные, используя предложение. –

Смежные вопросы