我有大约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
编辑:早些时候我打算写“如果你有一个主键”而不是外键;我修好了它.