Qt 10000插入

时间:2011-05-23 09:10:01

标签: qt postgresql insert

我想在数据库中进行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 个答案:

答案 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是瓶颈,那么网上有大量的性能调整信息,但我猜你是在做一笔交易。