#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 является узким местом, но я предполагаю, что вы выполняете свою работу на основе транзакции.