python – 优化Sqlite3 20,000次更新

我有大约20,000个项目的列表,我想插入表格(其中约有50,000行).这些项目中的大多数更新现有行中的某些字段,少数将插入全新的行.

我为每个项目访问数据库两次.首先是一个选择查询,检查该行是否存在.接下来,我根据select查询的结果插入或更新一行.我在更新/插入后立即提交每个事务.

对于前几千个条目,我每秒通过大约3或4个项目,然后它开始变慢.到最后,每次迭代需要超过1/2秒.为什么它会放慢速度?

我的平均时间是:整个运行时间为0.5秒,每个选择查询分为.18s,每次插入/更新分为.31s.最后的0.01是由于在进入数据库之前解析数据的几个未测量的过程.

更新

我已经将所有提交注释掉作为测试并且没有变化,所以不是这样(尽管如此,对于最佳提交的任何更多想法都会受到欢迎).

至于表结构:
每行有20列.前四个是TEXT字段(全部设置为第一个插入),16个是REAL字段,其中一个输入初始插入语句.

随着时间的推移,“杰出的”REAL字段将填充我正在尝试优化的过程.

我没有显式索引,但其中一个字段是每行的唯一键.

我应该注意到,随着数据库变得越来越大,SELECT和UPDATE查询花费的时间越来越多,SELECT操作的性能特别显着下降.

我最初认为这可能是SQLITE的某种结构问题(无论这意味着什么),但是无法在任何地方找到任何表明该程序存在自然限制的文档.

现在,该数据库约为60万美元.

最佳答案 我认为你的瓶颈是你使用/ avec每次插入/更新:

I commit each transaction right after the update/insert.

要么停止这样做,要么至少切换到WAL journaling;看到我的答案为什么:
SQL Server CE 4.0 performance comparison

如果您有主键,则可以使用INSERT INTO中的ON CONFLICT子句优化选择:

http://www.sqlite.org/lang_conflict.html

编辑:早些时候我打算写“如果你有一个主键”而不是外键;我修好了它.

点赞