Qt 10000 вставляет

#qt #postgresql #insert

#qt #postgresql #вставить

Вопрос:

Я хочу сделать более 10000 вставок в базе данных. Я использую этот простой код:

     int i = 0;
    for (i = 0; i < model->rowCount(); i  )
    {
        query.clear();
        query.prepare("INSERT INTO item (title, x, y, z) VALUES (:title, "
                      ":x, :y, :z);");
        query.bindValue(":title", title);
        query.bindValue(":x", model->data(model->index(i, 0)));
        query.bindValue(":y", model->data(model->index(i, 1)));
        query.bindValue(":z", model->data(model->index(i, 2)));

        if (! query.exec())
            return;
    }
  

но это слишком медленно, поскольку в найденной модели слишком много записей. Как я могу ускорить это? Может быть, в Qt доступны какие-то возможности вставки пакетов?

Я использую: Qt 4.7.0, PostgreSQL 8.4.8 и драйвер Qt SQL.

Комментарии:

1. Обязательно ли каждый раз вызывать clear и prepare ?

Ответ №1:

Просто подготовить один раз, выполнить много? Я совсем не знаком с QT, но это может ускорить весь процесс:

 int i = 0;
query.prepare("INSERT INTO item (title, x, y, z) VALUES (:title, "
   ":x, :y, :z);");

for (i = 0; i < model->rowCount(); i  )
{
    query.bindValue(":title", title);
    query.bindValue(":x", model->data(model->index(i, 0)));
    query.bindValue(":y", model->data(model->index(i, 1)));
    query.bindValue(":z", model->data(model->index(i, 2)));

    if (! query.exec())
        return;
}
  

Ответ №2:

Создайте транзакцию, вставьте значения, затем зафиксируйте.

Ответ №3:

решение @Berry Langerak является правильным для Qt-стороны вещей …. если вы успешно запустили транзакцию.

В противном случае вы можете захотеть заглянуть в, чтобы СКОПИРОВАТЬ, но я не думаю, что это ваша проблема.

Быстрое изменение ваших настроек postgresql.conf может быть быстрым решением, если вы не можете понять, как НАЧАТЬ транзакцию. Если вы находитесь за пределами транзакции, каждая ВСТАВКА приводит к вызову fsync (2).

 synchronous_commit = off
  

В Интернете есть множество сведений о настройке производительности, если вы обнаружите, что PostgreSQL является узким местом, но я предполагаю, что вы выполняете свою работу на основе транзакции.