Sql 有没有办法推迟更新索引?

Sql 有没有办法推迟更新索引?,sql,sqlite,indexing,Sql,Sqlite,Indexing,我有一个巨大的数据库,它是用来编制索引的,我在其中插入了大量的信息,分成了上千个块。每次插入一个索引时,索引都会更新。问题是,插入信息所需的时间在大约第100次之后变得非常长,这是因为这些巨大的事务导致日志文件攀升到300兆以上 有没有一种方法可以推迟更新索引(可能是使用冻结索引命令或其他方法),从而使索引保持在架构中定义的状态,并且在填充所有表之后,可以解冻并更新索引 我知道这可以通过删除索引和创建索引来实现,但我一直在寻找一个更优雅的解决方案,或者可能是一个技巧 不幸的是,我无法轻松地更改D

我有一个巨大的数据库,它是用来编制索引的,我在其中插入了大量的信息,分成了上千个块。每次插入一个索引时,索引都会更新。问题是,插入信息所需的时间在大约第100次之后变得非常长,这是因为这些巨大的事务导致日志文件攀升到300兆以上

有没有一种方法可以推迟更新索引(可能是使用
冻结索引
命令或其他方法),从而使索引保持在架构中定义的状态,并且在填充所有表之后,可以解冻并更新索引

我知道这可以通过
删除索引
创建索引
来实现,但我一直在寻找一个更优雅的解决方案,或者可能是一个技巧


不幸的是,我无法轻松地更改DBMS,否则我将使用PostgreSQL进行调查。

您希望在事务中运行插入(或使用事务进行批处理)。一旦提交,索引将被更新。

除了不“优雅”之外,还有其他原因不想使用DROP index/CREATE index吗。我想您是在定期维护期间进行批量装载的?在批量数据加载中,删除索引/创建索引几乎是标准的过程。通过在末尾重新创建非聚集索引,您可以确保数据库能够创建最有效的索引结构(从而使针对数据的查询运行得更快)

某些数据库具有其他功能,可以对您隐藏这些详细信息(SQL server允许您“禁用/启用”索引),但在幕后,它们仍然有效地执行删除索引/创建索引

同样,即使存在“冻结索引”,也不会保存任何内容。如果要输入大量数据,最好在最后完全重建索引(这实际上就像“删除索引/创建索引”)


如果您的日志变得太大,也许您应该将插入拆分为更小的事务块?

尽管如果在事务中完成,sqllite只会在事务提交时更新索引。同时,索引仍然可用于其他查询,这似乎是一个最佳解决方案。@llion“其他查询”?SQLite不能充分处理并行查询;一旦启动更改数据的事务,数据库将锁定到其他查询,直到该查询完成。