我有一个庞大的数据库,它应该被编入索引,我将大量信息插入其中,分解成一千个块。每次插入一个索引都会更新。问题是,插入信息所需的时间在大约100左右之后变得非常长,因为这些巨大的交易导致日志文件爬升到超过300兆。
有没有办法推迟更新索引(可能使用FREEZE INDEX
命令或其他东西),从而索引将在架构中保持定义,并且在填充了所有表之后,它可能会被解冻和更新
我知道这可以通过DROP INDEX
和CREATE INDEX
完成,但我正在寻找一种更优雅的解决方案,或者可能是一种技巧。
不幸的是,我无法轻松更改DBMS,或者我会调查使用PostgreSQL。
答案 0 :(得分:3)
除了它不是“优雅”之外还有其他任何原因你不想使用DROP INDEX / CREATE INDEX。我假设您在定期维护期间正在进行此批量加载? DROP INDEX / CREATE INDEX是批量数据加载中的标准过程。通过在末尾重新创建非聚集索引,您可以确保数据库可以创建最有效的索引结构(从而使对数据的查询运行得更快)。
某些数据库具有隐藏这些详细信息的附加功能(SQL Server允许您“禁用/启用”索引)但在幕后它们仍在有效地执行DROP INDEX / CREATE INDEX。
同样,即使有“FREEZE INDEX”,你也不会保存任何东西。如果要输入大量数据,最好在最后完全重建索引(这实际上就像“DROP INDEX / CREATE INDEX”)。
如果您的期刊变得太大,或许您应该将插入内容拆分为更小的事务块?
答案 1 :(得分:1)
您希望在事务中运行插入(或使用事务批处理)。提交后,索引将会更新。