我有一个sqlite3数据库,一个表和一个主键由两个整数组成,我试图插入大量的数据(即约1GB左右)
我所遇到的问题是,创建主键也会隐式地创建一个索引,在我的情况下,在几次提交之后,将这些索引插入到爬网中(这将是因为数据库文件位于NFS ..叹息).
所以,我想以某种方式临时禁用该索引.到目前为止,我最好的计划是删除主键的自动索引,但是似乎sqlite不喜欢它,如果我尝试这样做,会抛出错误.
我的第二好的计划将涉及应用程序在网络驱动器上创建数据库的透明副本,进行修改,然后将其合并.请注意,与大多数sqlite / NFS问题相反,我不需要访问并发.
什么是正确的方式来做这样的事情?
更新:
我忘了指定我已经在使用的标志:
PRAGMA synchronous = OFF PRAGMA journal_mode = OFF PRAGMA locking_mode = EXCLUSIVE PRAGMA temp_store = MEMORY
更新2:
我实际上是批量插入项目,但是每下一个批次都比前一个批处理更慢(我假设这与索引的大小有关).我尝试做了10k到50k元组之间的批次,每一个都是两个整数和一个浮点数.
>您不能删除嵌入式索引,因为它是行的唯一地址.
>将2个整数键合并在单个长按键=(key1< 32)key2;并将它作为一个INDER PRIMARY KEY在你的模式(在这种情况下,你将只有一个索引)
>设置新DB的页面大小至少为4096
>删除除主要外的任何附加索引
>以SORTED顺序填写数据,使主键增长.
>重用命令,不要每次从字符串创建
>将页面缓存大小设置为尽可能多的内存(请记住,缓存大小是以页数为单位,但不是字节数)
>提交每50000个项目.
>如果您有其他索引 – 只有在表中的所有数据后创建它们
原文链接:https://www.f2er.com/sqlite/197765.html>将2个整数键合并在单个长按键=(key1< 32)key2;并将它作为一个INDER PRIMARY KEY在你的模式(在这种情况下,你将只有一个索引)
>设置新DB的页面大小至少为4096
>删除除主要外的任何附加索引
>以SORTED顺序填写数据,使主键增长.
>重用命令,不要每次从字符串创建
>将页面缓存大小设置为尽可能多的内存(请记住,缓存大小是以页数为单位,但不是字节数)
>提交每50000个项目.
>如果您有其他索引 – 只有在表中的所有数据后创建它们
如果您能够合并密钥(我认为您使用的是32位,而sqlite使用64位,因此可能)并以排序顺序填写数据,我敢打赌,您将填写与第二个和第二个相同的性能将足够快