【发布时间】:2017-06-08 14:52:20
【问题描述】:
我在 SQLite 中创建一个数据库如下:
QSqlQuery create_address;
create_address.prepare("CREATE TABLE addresses (addressid INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT UNIQUE)");
QSqlQuery create_devices;
create_devices.prepare("CREATE TABLE devices (ch TEXT PRIMARY KEY, addressid INTEGER REFERENCES addresses(addressid))");
create_devices.exec();
create_address.exec();
我需要访问这个数据库很多次(~660'000)传递ch并检索相应的地址,传递的ch不能在数据库中(返回空字符串)。
为此,我进行了以下查询
//outside loop
QSqlQuery find_address;
find_address.prepare("SELECT address FROM addresses,devices WHERE devices.addressid = addresses.addressid AND devices.ch = :chcode");
//in loop
find_address.bindValue(":chcode",QString::fromStdString(ch_code));
find_address.exec();
问题是这个过程非常慢(完成所有 660'000 次搜索需要将近 12 分钟)。
在此之前,我尝试使用INNER JOIN,但性能几乎相同。
有没有更好的方法来编写查询和/或构建数据库以获得更快的执行时间?
【问题讨论】:
-
您是否重复使用
prepared 语句/查询?还是每次要搜索时都运行prepare? -
你有一个循环来准备和选择吗?
-
@phyatt 我在一个循环中调用的函数中有该语句,所以我每次搜索时都运行准备,这对性能有显着影响吗?我什至不认为这可能是一个问题
-
@MichaelO。我已经编辑了问题,我将准备移到了循环之外,但执行时间并没有太大变化