在SQLITE数据库中写入记录需要花费大量时间。如何提高插入操作的效率? 数据库中表中插入1亿1000万个记录的时间是使用C++接口API的时间(>1小时)。

在SQLITE数据库中写入记录需要花费大量时间。如何提高插入操作的效率? 数据库中表中插入1亿1000万个记录的时间是使用C++接口API的时间(>1小时)。,c++,c,database,sqlite,C++,C,Database,Sqlite,是否有任何方法可以缩短此时间并提高插入操作的效率 我将1000条记录分组到一个事务中,然后执行它们 sqlite3\u exec(开始事务) sqlite3\u exec(插入) sqlite3\u exec(结束事务) 这需要很长时间 如何提高插入效率?假设您的所有语句都是插入到同一个表中的语句,您可能可以通过将语句创建为准备好的语句,然后对每一行重复使用它(每次都将其绑定到新数据)来提高性能。对准备好的报表进行一些解释是必要的;基本思想是,您不用执行sqlite3\u exec,而是使用sq

是否有任何方法可以缩短此时间并提高插入操作的效率

我将1000条记录分组到一个事务中,然后执行它们

sqlite3\u exec(开始事务)

sqlite3\u exec(插入)

sqlite3\u exec(结束事务)

这需要很长时间


如何提高插入效率?

假设您的所有语句都是插入到同一个表中的
语句,您可能可以通过将语句创建为准备好的语句,然后对每一行重复使用它(每次都将其绑定到新数据)来提高性能。对准备好的报表进行一些解释是必要的;基本思想是,您不用执行
sqlite3\u exec
,而是使用
sqlite3\u prepare\u v2
(使用占位符而不是数据)准备一条语句,然后为每一行将其绑定到数据,执行并重置它。这样,SQLite就不必每次都重新分析/重新编译语句,因为只有值会更改。

假设所有语句都只是
插入到同一个表中,您可能可以通过将语句创建为准备好的语句,然后对每一行重复使用它来提高性能(每次都将其绑定到新数据)。对准备好的语句的一些解释是;基本思想是,不要使用
sqlite3\u exec
,而是使用
sqlite3\u prepare\u v2
(用占位符代替数据)准备语句,然后为每一行将其绑定到数据,执行它,并重置它。这样,SQLite就不必每次都重新分析/重新编译语句,因为只有值会更改。

sqlite3\u exec
已经进行了一次准备,即每1000次插入就有一次准备。这可以改进,但可能会通过不到1%。@ArneVogel这正是这个答案的要点。你不用为每个
sqlite3\u exec
做准备,而是为整个批次做一次准备。这种技术可以节省多少时间,只能通过测量来确定,没有必要猜测“可能”是什么AgRIdDasPIDIUS测量是很好的,但是经验和推测是单独的问题。例如,考虑我在哪里使用一个准备好的语句,它的插入吞吐量增加了一倍以上,但是它与单一的插入调用相比于<代码> SqLITE3AXEXEC < /代码>。因此,我考虑了一个简单的优化。结果表明,减少事务的数量是优先权的0.13%。@阿纳沃格尔,我最初的问题是,OP对每个事务进行了1000次调用。值元组,但在这种情况下,解析/编译语句的成本将相应增加。@ArneVogel“其中使用准备好的语句的插入吞吐量增加了一倍”加倍?使用
sqlite3_exec对单行执行“每秒85次插入”,而使用准备好的语句执行“每秒53000次插入”,这是改进的600倍。这一双重改进与将整个插入放在事务中相比。这不是所示代码中所做的。
sqlite3_exec
已经做了一个准备,即每1000次插入将有一个准备。这可以改进,但可能通过HP改进@ArneVogel这正是这个答案的要点。你不用为每个
sqlite3\u exec
做准备,而是为整个批次做一次准备。这种技术可以节省多少时间,只能通过测量来确定,没有必要猜测“可能”是什么AgRIdDasPIDIUS测量是很好的,但是经验和推测是单独的问题。例如,考虑我在哪里使用一个准备好的语句,它的插入吞吐量增加了一倍以上,但是它与单一的插入调用相比于<代码> SqLITE3AXEXEC < /代码>。因此,我考虑了一个简单的优化。结果表明,减少事务的数量是优先权的0.13%。@阿纳沃格尔,我最初的问题是,OP对每个事务进行了1000次调用。值元组,但在这种情况下,解析/编译语句的成本将相应增加。@ArneVogel“其中使用准备好的语句的插入吞吐量增加了一倍”加倍?使用
sqlite3_exec对单行执行“每秒85次插入”,而使用准备好的语句执行“每秒53000次插入”,这是改进的600倍。将双重改进与将整个插入放入事务中进行比较。这不是所示代码中所做的。