【问题标题】:Why python+sqlite3 is extremely slow?为什么 python+sqlite3 非常慢?
【发布时间】:2013-06-29 20:24:12
【问题描述】:

我尝试使用“Python 2.7.4 + sqlite3”和“Firefox SQLite Manager 0.8.0”处理对同一数据库的相同请求。

在小型数据库(8000 条记录)上,Python 和 Firefox 运行速度很快,并给出相同的结果。

在更大的数据库上(2600000 条记录):

  • SQLite 管理器在 28 秒内处理数据库(24 条记录)
  • Python 程序已经运行了 20 分钟,没有任何结果

下面的程序有什么问题,导致python sqlite3无法在合理的时间内处理查询,而相同的请求可以更快地处理?

import sqlite3

_sql1 = """SELECT DISTINCT J2.rule_description,
                J2.feature_type,
                J2.action_item_id,
                J2.rule_items
FROM journal J1,
     journal J2
WHERE J1.base = J2.base
    AND J1.action_item_id=J2.action_item_id
    AND J1.type="Action disabled"
    AND J2.type="Action applied"
    AND J1.rule_description="Some test rule"
    AND J1.action_item_id IN (1, 2, 3, 14, 15, 16, 17, 18, 19, 30, 31, 32)
"""

if __name__ == '__main__':
    sqlite_output = r'D:\results.sqlite'
    with sqlite3.connect(sqlite_output) as connection:
        for row in connection.execute(_sql1):
            print row

更新:Command Line Shell For SQLite 也返回相同的 24 条记录

UPDATE2: sqlite3.sqlite_version 是 '3.6.21'

【问题讨论】:

  • 您确定 SQLite 管理器正在处理 所有 结果行吗?你的 Python 程序是……
  • 是的,“SQLite 的命令行外壳”也给出了相同的 24 条记录
  • 可能是数据库文件被SQLite Manager锁定了?
  • 检查 SQLite 版本 (SELECT sqlite_version();)。
  • 数据库未锁定:重启后一样

标签: performance python-2.7 python-3.x sqlite


【解决方案1】:

看来,问题与 Python 2.7 附带的旧版本 sqlite 有关。在 python 3.3 中一切正常。

非常感谢@CL 的精彩评论!

在 python 2.7 中

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.6.21'

在 python 3.3 中

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.7.12'

【讨论】:

  • 如果需要,您可以通过升级 sqlite 继续使用 Python 2.7。
  • @EOL 另一个(也许更好的)解决方案是创建索引。我只是对性能上的差异感到好奇
  • 是的,索引可以大大加快速度。我也很好奇,所以对这个问题和你的回答+1。 :)
  • 从 python 2.7 从 sqlite3 版本 '3.6.21' 升级到 '3.8.7.4' 后,一个狗的更新操作(50,000 条记录 300 秒)到 2 秒。升级说明在这里:stackoverflow.com/a/8761073/1804262
  • 我刚刚通过升级 dll 文件体验了类似的加速。我遇到了完全相同的问题 - 通过 sqlite 命令行快速运行查询,但在 Python 中运行速度非常慢。对我来说也是 3.6.21 dll 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2021-12-03
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多