【发布时间】:2011-07-15 18:07:38
【问题描述】:
我有大约 20,000 个要插入到表中的项目的列表(其中大约有 50,000 行)。这些项目中的大多数会更新现有行中的某些字段,少数会插入全新的行。
我为每个项目访问数据库两次。首先是检查行是否存在的选择查询。接下来我根据选择查询的结果插入或更新一行。我在更新/插入后立即提交每个事务。
对于前几千个条目,我每秒处理大约 3 或 4 个条目,然后它开始变慢。到最后,每次迭代需要超过 1/2 秒。为什么可能会放缓?
我的平均时间是:整个运行 0.5 秒,每个选择查询 0.18 秒,每个插入/更新 0.31 秒。最后一个 0.01 是由于在进入数据库之前解析数据的几个未测量的过程。
更新
我已将所有提交注释为测试并且没有任何更改,所以不是这样(不过,欢迎更多关于最佳提交的想法)。
关于表结构: 每行有二十列。前 4 个是 TEXT 字段(都是用第一个 insert 设置的),16 个是 REAL 字段,其中一个是用初始 insert 语句输入的。
随着时间的推移,“优秀”的 REAL 字段将填充我在这里尝试优化的过程。
我没有明确的索引,尽管其中一个字段是每一行的唯一键。
我应该注意到,随着数据库变得越来越大,SELECT 和 UPDATE 查询都花费了越来越多的时间,其中 SELECT 操作的性能特别显着下降。
我最初认为这可能是 SQLITE 的某种结构问题(无论这意味着什么),但在任何地方都找不到任何表明该程序存在自然限制的文档。
数据库现在大约有 60 兆兆。
【问题讨论】:
-
您可以使用
PRAGMAs、日志等调整 SQLite。 -
那些时间“先验”可怕,但我们需要更多的背景才能真正有一个想法。你能发布表格的结构,以及一些典型记录的示例吗?
-
你尝试过 WAL 日志吗?
-
你知道我实际上没有。你的回答让我意识到我没有明确的主键,所以我用主键重建了表。这对速度有很大帮助,但是当我将插入和更新分组以使用“executemany”而不是“execute”时,我真的赢了。现在整个过程大约需要 30 秒,而不是 2-3 小时。
标签: python performance optimization sqlite