Несколько обновлений SQL лучшие практики - PullRequest
0 голосов
/ 29 августа 2011

Я рассматриваю три альтернативы, казалось бы, простой задаче обновления нескольких строк в таблице.Я хотел бы знать, какой из них лучше с точки зрения эффективности и читабельности кода.Хотя я не уверен, что есть четкий ответ на вопрос об эффективности, который может зависеть от используемой базы данных.

В моем конкретном случае я использую PostgresSQL в качестве базы данных, и рассматриваемая таблица содержит менее миллиона записей.У меня сейчас есть процесс, который отвечает за извлечение подмножества данных из этой таблицы, выполнение некоторой работы, а затем обновление этих строк с помощью отметки времени.

На мой взгляд, у меня есть три варианта:

  1. Создание одного оператора обновления с помощью предложения in, содержимое которого будет заменено созданной строкой, содержащейидентификаторы строк для обновления.

    String update = "update mytable set mydate = now() where id in (?)";
    StringBuilder ids = new StringBuilder();
    
    for (Item item : items) { 
        ids.append(item.getId()).append(","); 
    }
    
    ids.setLength(ids.length() - 1);
    update.replace("?", ids.toString());    
    ps = con.prepareStatement(update);
    ps.executeUpdate();
    
  2. Использовать партию

    ps = con.prepareStatement("update mytable set mydate = now() where id = ?");
    
    for (Item item : items) { 
        ps.setInt(1, item.getId());
        ps.addBatch();
    }
    
    ps.executeBatch();
    
  3. Использовать транзакцию

    con.setAutoCommit(false);
    ps = con.prepareStatement("update mytable set mydate = now() where id = ?");
    
    for(Item item : items) { 
        ps.setInt(1, item.getId());
        ps.executeUpdate();
    }
    
    con.commit();
    

Что из этого будет считаться наилучшей практикой?Или есть другой способ предложить?Лично мне нравится второй вариант, он лаконичен и легок в подготовке, но мне кажется, что вариант номер один будет наиболее эффективным.

1 Ответ

1 голос
/ 29 августа 2011

Мысли о ваших предложениях
Транзакция имеет явное преимущество, позволяя откатить обновление.

Построенный оператор SQL содержит риск поломки, также обратите внимание, что вы отправляете по каналу lot данных.

Альтернативные предложения

объединение с временной таблицей Я хотел бы создать временную таблицу, содержащую все значения для обновления, а затем создать оператор обновления с объединением с временной таблицей для обновления.

использовать копию
Если вам нужна грубая скорость, я бы предложил copy, см .:
http://wiki.postgresql.org/wiki/COPY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...