• 12056阅读
  • 12回复

用QSqlQuery向数据库中批量添加数据异常慢! [复制链接]

上一主题 下一主题
离线snowfield
 
只看楼主 倒序阅读 楼主  发表于: 2012-01-08

我希望从文本文件(filename2)中批量读入数据写入数据库(filename1)中,但不知为何,速度出奇的慢。500个记录(读取的文本数据为24k左右,生成的数据库为500K)竟然用了一分多钟!请帮忙看看我的代码存在什么问题?有什么好的办法可以快速批量向数据库中导入数据?谢谢!


    QSqlDatabase dbconn = QSqlDatabase::addDatabase("QSQLITE");
    dbconn.setDatabaseName(filename1); //数据库文件
    QSqlQuery query;


    query.exec(QString("create table test(id varchar, e varchar, t varchar, c varchar);"));  


    QFile file(filename2);//从文本文件中读取数据


    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
    int i = 0;


    QTextStream in(&file);
    QStringList lines = in.readAll().split("\n");
    query.prepare("insert into test values(?, ?, ?, ?)");
    QVariantList v1, v2, v3, v4;


    while(i < 500){
        QString line = lines[i];
        QStringList s = line.split("\t");
        v1 << i++;
        v2 << s[2];
        v3 << s[3];
        v4 << s[4];
    }
    query.addBindValue(v1);
    query.addBindValue(v2);
    query.addBindValue(v3);
    query.addBindValue(v4);
    if(!query.execBatch())
        qDebug() << query.lastError();



离线wxj120bw

只看该作者 1楼 发表于: 2012-01-08
回 楼主(snowfield) 的帖子
QStringList lines = in.readAll().split("\n");
..........
QString line = lines;//file.readLine();

代码是连续的吗 上面lines的定义在那?
离线snowfield
只看该作者 2楼 发表于: 2012-01-08
代码是连续的,调试通过的。QStringList lines = in.readAll().split("\n");这句就是定义加赋值吗?
离线jdwx

只看该作者 3楼 发表于: 2012-01-08
回 2楼(snowfield) 的帖子
你有看过程序执行过后数据库里的内容吗?
while(i < 500){
        QString line = lines;//file.readLine();
        QStringList s = line.split("\t");
        v1 << i++;
        v2 << s[2];
        v3 << s[3];
        v4 << s[4];
    }
而且红色的那行代码,编译能通过吗?
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线snowfield
只看该作者 4楼 发表于: 2012-01-08
Re:回 2楼(snowfield) 的帖子
引用第3楼jdwx于2012-01-08 14:52发表的 回 2楼(snowfield) 的帖子 :
你有看过程序执行过后数据库里的内容吗?
while(i < 500){
        QString line = lines;//file.readLine();
        QStringList s = line.split("\t");
        v1 << i++;
.......

不好意思,排版的时候弄错了,应该是QString line = lines;
离线jdwx

只看该作者 5楼 发表于: 2012-01-08
回 4楼(snowfield) 的帖子
真能通过编译吗?
line是QString
lines是QStringList

QString line = lines;    ???
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jdwx

只看该作者 6楼 发表于: 2012-01-08
回 4楼(snowfield) 的帖子
原来代码又改了,既然没错就好办了。
把代码拆成两个部分,读文件,和写入数据库。分别计算时间。看看时间都消耗在哪里了。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线snowfield
只看该作者 7楼 发表于: 2012-01-09
Re:回 4楼(snowfield) 的帖子
引用第6楼jdwx于2012-01-08 21:24发表的 回 4楼(snowfield) 的帖子 :
原来代码又改了,既然没错就好办了。
把代码拆成两个部分,读文件,和写入数据库。分别计算时间。看看时间都消耗在哪里了。


时间几乎全部耗在了query.execBatch()这个语句上。即使while(i < 15000)时,从文本文件读取文本内容和while循环一起的时间也不过1秒左右,而while(i <500)时,在奔腾1.7G的笔记本上执行query.execBatch()的时间就已经是1分钟还多。而生成的数据只有500多K
离线jdwx

只看该作者 8楼 发表于: 2012-01-09
回 7楼(snowfield) 的帖子
如果你的数据库支持事物处理,就启用。

发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线lucktty

只看该作者 9楼 发表于: 2012-01-13
别用批处理试试  一条记录差一条sql看
离线lucktty

只看该作者 10楼 发表于: 2012-01-13
我用oracle差一万条记录也就3秒不到
离线d_ecade

只看该作者 11楼 发表于: 2012-03-05
楼主问题解决没?是什么情况啊?
离线1120892638

只看该作者 12楼 发表于: 2021-06-22
请问解决了吗?我使用事务也很慢
快速回复
限100 字节
 
上一个 下一个