我有一个数据库,它有一个代理,可以定期删除(通过Java代理,"removePermanently"方法)视图中的所有文档并重新创建它们。
一个月后,我注意到数据库的大小大大增加了。通过此命令显示数据库信息
sh database <dbpath>
结果我有很多被删除的文档(我想它们是删除存根)
Document Type Live Deleted
Documents 1,922 817,378
正在压缩数据库,已恢复80%的空间。
有没有一种方法可以通过编程方式最终删除存根,以避免"数据库爆炸"?或者,有没有一种方法可以正确管理这种情况(删除和创建文档)?
不要删除文档!重复使用它们。这是最好的答案。认真地取现有文档,清除字段并设置Form:="Obsolete"。修改所有视图的选择公式,方法是将& Form != "Obsolete"
附加到选择公式Form = "Obsolete"
创建一个名为"过时"的新隐藏视图,并更改代码以转到"过时"视图,获取可用文档并设置新字段值(包括更改"表单"字段),而不是创建新文档。只有在"过时"视图中没有足够的可用文档时,才能创建新文档。这样做所损失的任何性能(在您拥有的文档数量看来应该是最小的)都将被您通过避免所有删除和创建新文档而创建的NSF文件的增长和碎片化所获得的收益所抵消。
然而,如果您无法做到这一点——也许是您无法控制的某个第三方工具在创建文档——那么了解您所说的数据库是否被复制是很重要的。如果它是复制的,那么您必须非常小心,因为在所有副本更新之前清除删除存根会导致删除的文档"复活",如果在删除发生之前已经脱机的副本重新联机。
如果数据库根本没有复制,或者在所有副本之间快速可靠地复制,则可以缩短清除间隔。转到"复制设置"对话框,找到标记为"删除过去__天内未修改的文档"的复选框。不要复选框,而是在天数中输入一个小数字。删除存根的清除间隔将设置为该数字的1/3。因此,如果将其设置为3,则效果将是存根保留1天,然后清除,这将给您24小时的时间来确保所有副本都是最新的。如果需要更多,请将间隔设置得更高,根据需要保持3倍倍数。如果服务器长时间停机(比清除间隔长),请调整您的操作过程,以便确保在数据库重新联机之前禁用将数据库复制到该服务器,并且可以删除和重新创建副本。不过,请注意,用户副本也会带来同样的问题,并且不可能真正控制或意识到可能离线时间超过清除间隔的用户副本。在任何情况下,请记住:不要复选框。要减少删除存根的清除间隔,只需减少数量即可。
除此之外,以编程方式删除删除存根的唯一方法需要使用NotesC API。可以从LotusScript调用所需的例程,但根据我的经验,一旦存根加文档的总数太高,你可能会遇到错误,可能需要创建和部署一个新的数据库非副本副本副本才能通过。你可以在前面这个问题的答案中找到代码和我的解释。
我不得不支持Richard关于重用文档的建议。我最近有一个类似的项目,开始了你每天晚上删除所有内容并导入50万条记录的方式。删除存根和FT指数的增长很快成为问题,消耗了大量的磁盘空间,并显著降低了性能。我试图管理删除存根,但我显然违背了Domino体系结构的原则。
我在这里阅读了Richard的建议,并采用了这种方法。以下是我所做的:
1) 基于表单创建两个视图-一个用于"活动"记录,另一个用于的"非活动"记录
2) 通过为两个视图设置autoupdate=false来启动代理
3) 使用stampall("形式"、"非活动")将所有活动记录更改为非活动
4) 使用notesview.refresh()手动刷新2个视图
5) 开始导入数据。对于每条记录,从非活动记录池中提取一个文档(通过遍历"非活动"视图)
6) 如果池中的非活动记录用完,请创建新的
7) 导入完成后,再次手动刷新视图
8) 使用db.createftindex(0,true)重新创建FT索引
代码实际上并没有那么复杂,它运行的时间与我原来的方法差不多,甚至更快。
谢谢Richard!
此外,请查看高级数据库属性—其中的一些内容将有助于优化数据库。
通过定期删除所有文档并从其他来源创建新文档,听起来像是在"刷新"数据库的内容。别这样。如果数据已经在Notes数据库中,请不要使用文档。你的工作效率很低。