首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高sqlite查询速度

提高sqlite查询速度
EN

Stack Overflow用户
提问于 2015-02-12 12:08:20
回答 2查看 549关注 0票数 2

我在数据库中有一个要更新的数字列表(实际上是百分比)。查询非常简单,我在代码中的某个地方获得项目的id,然后在数据库中用数字列表更新这些项。请看我的代码:

代码语言:javascript
复制
start_time = datetime.datetime.now()

query = QtSql.QSqlQuery("files.sqlite")
for id_bdd, percentage in zip(list_id, list_percentages):
    request = "UPDATE papers SET percentage_match = ? WHERE id = ?"
    params = (percentage, id_bdd)

    query.prepare(request)

    for value in params:
        query.addBindValue(value)

    query.exec_()

    elsapsed_time = datetime.datetime.now() - start_time
    print(elsapsed_time.total_seconds())

生成list_percentages需要1秒,在数据库中写入所有百分比需要超过2分钟。我使用sqlite作为数据库,数据库中大约有7000项。查询花费这么多时间是正常的吗?如果没有,是否有优化它的方法?

编辑:与std库中的sqlite3模块进行比较:

代码语言:javascript
复制
bdd = sqlite3.connect("test.sqlite")
bdd.row_factory = sqlite3.Row
c = bdd.cursor()

request = "UPDATE papers SET percentage_match = ? WHERE id = ?"

for id_bdd, percentage in zip(list_id, list_percentages):
    params = (percentage, id_bdd)
    c.execute(request, params)

bdd.commit()
c.close()
bdd.close()

我认为QSqlQuery在每个循环圈提交更改,而sqlite3模块允许在结束时提交所有不同的查询。

对于相同的测试数据库,QSqlQuery需要22s,而“普通”查询需要0.3s,我不敢相信这只是一个perf问题,我必须做一些错误的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-12 12:24:41

您需要启动一个transaction,并在循环之后对所有更新进行commit

未进行测试,但应接近:

代码语言:javascript
复制
start_time = datetime.datetime.now()

# Start the transaction time
QtSql.QSqlDatabase.transaction()

query = QtSql.QSqlQuery("files.sqlite")
for id_bdd, percentage in zip(list_id, list_percentages):
    request = "UPDATE papers SET percentage_match = ? WHERE id = ?"
    params = (percentage, id_bdd)

    query.prepare(request)

    for value in params:
        query.addBindValue(value)

    query.exec_()

# commit changues
if QtSql.QSqlDatabase.commit():
   print "updates ok"

elsapsed_time = datetime.datetime.now() - start_time
print(elsapsed_time.total_seconds())

另一方面,这个问题可能是数据库性能问题,请尝试在id字段上创建一个索引:createindex.html

您将需要直接访问数据库。

代码语言:javascript
复制
create index on papers (id);
票数 0
EN

Stack Overflow用户

发布于 2015-02-12 14:02:23

你真的需要每次都打电话准备吗?在我看来,请求似乎没有改变,所以这个“准备”函数可以移出循环吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28477099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档