我想在数据库中进行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驱动程序。
答案 0 :(得分:6)
准备一次,执行多次?我对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;
}
答案 1 :(得分:2)
创建transaction,插入值,然后commit。
答案 2 :(得分:0)
@Berry Langerak的解决方案对于Qt方面是正确的解决方案......如果你已经成功started a transaction。
如果做不到这一点,您可能需要查看COPY,但我认为这不是您的问题。
如果您无法弄清楚如何开始交易,快速更改postgresql.conf设置可能是一个快速解决方法。如果您不在事务中,则每个INSERT都会产生一个fsync(2)调用。
synchronous_commit = off
如果您发现PostgreSQL是瓶颈,那么网上有大量的性能调整信息,但我猜你是在做一笔交易。