Вставки Qt 10000 - PullRequest
2 голосов
/ 23 мая 2011

Я хочу сделать свыше 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.

Ответы [ 3 ]

6 голосов
/ 23 мая 2011

Просто подготовиться один раз, выполнить много?Я совсем не знаком с 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 голосов
/ 23 мая 2011

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

0 голосов
/ 23 мая 2011

@ Решение Берри Лангерака является правильным для стороны Qt .... если вы успешно начали транзакцию .

В противном случае, возможно, вы захотите посмотреть на COPY , но я не думаю, что это ваша проблема.

Быстрое изменение ваших настроек postgresql.conf может быть быстрым решением, если вы не можете понять, как начать транзакцию. Если вы находитесь за пределами транзакции, каждая INSERT приводит к вызову fsync (2).

synchronous_commit = off

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

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