我正在填充一张中型桌子(60GB,5亿行)。如果表没有主键(使用批量插入约1小时),则该过程可以相当快地完成,但如果使用主键创建该表,则需要大约10倍的时间。我假设这是因为验证唯一性约束需要时间,并且还要更新每个插入的索引。
我认为一个好的解决方法是稍后添加主键,因为与增量索引相比,已经填充的表上的索引应该快得多。但sqlite似乎没有选择在创建表后添加主键(不知道为什么?)。
我想我根本不能使用主键,而只是在填充表后添加唯一索引。这有什么不利之处吗?
或推荐任何更好的解决方案?
答案 0 :(得分:1)
从纯技术角度来看,唯一索引与主键具有完全相同的效果。 (在SQLite中,一些主键允许NULL以便向后兼容。)
唯一的区别是主键约束没有出现在表定义本身中,这对于文档来说可能是一件坏事。
另见Is CREATE UNIQUE INDEX or INTEGER PRIMARY KEY more performant in SQLite。
答案 1 :(得分:0)
在事务中运行批量插入,你会避免一些缓慢插入的事情。
我刚刚发现这是关于如何在sqlite3中加快速度的一篇很好的文章。