我有一个考勤记录系统,有2个数据库,一个用于当前,另一个用于存档。服务器处理出勤记录,并将标记为已完成的记录放入存档中。存档数据库中没有完成处理。
这是问题所在。其中一项要求是每天为每位员工建立一个空白记录,并记录出勤记录。执行此操作的代理程序会调用几个过程并在数据库中进行一些检查。截至目前,每天创建大约1,800个空白记录。在开发PC上,处理每个记录大约需要2到3秒,这相当于平均一个半小时。但是,当我们在服务器上部署它时,处理每个记录大约需要7秒钟,大约需要3个半小时才能完成。我们遇到过代理需要4.5到5个小时才能完成的情况。
请注意,在这两种情况下,都会安排代理。服务器中没有其他Lotus应用程序,并且服务器大多数时间是空闲和空闲的(除了Windows Server和Lotus Notes之外没有其他应用程序)。是否有任何可能导致在开发PC和服务器上进行额外处理时间的事情?
答案 0 :(得分:1)
您的流程每天生成1800个新文档,并且您已经说过您还要定期归档文档,因此我认为这意味着您在归档文档后将其删除。在这样的应用程序中,性能问题可能会随着时间的推您可能在数据库中有大量删除存根,并且NSF文件可能是高度分散的(内部和/或外部)。
您应该使用免费的NotesPeek实用程序来检查数据库并查看它包含多少个删除存根。然后你应该检查purge interval setting并考虑将它降低到你觉得最合适的值。 (即,足够大,因此您知道所有服务器和用户将在该时间内复制,但小到足以避免允许大量删除存根。)如果更改清除间隔,则可以等待24小时以使存根成为已清除,或者您可以在服务器控制台上对数据库手动运行updall以强制它。
然后你应该在NSF文件上运行compact -c,并在NSF所在的服务器磁盘卷上运行碎片整理。
如果这些步骤确实提高了性能,那么您可能希望在代码中采取措施,通过使用最小化删除存根,数据库增长和碎片的编码技术来防止问题再次发生。
即,进入您的代码进行存档,并进行更改,以便在存档后不会删除它们。相反,让您的代码使用FreeDocList := "1"
等字段标记它们。然后添加名为(FreeDocList)
的隐藏视图,其中包含选择公式FreeDocList = "1"
。还可以在数据库中查看其他视图,并将& (!(FreeDocList = "1"))
添加到选择公式中。然后更改代码添加新的空白文档,这样它就可以转到FreeDocList
视图而不是创建新文档,找到第一个文档,设置FreeDocList = "0"
,并清除所有以前的字段值。当然,如果FreeDocList视图没有足够的文档,您的代码将恢复旧行为并创建新文档。
通过上述更改,您将尽可能重复使用现有文档,而不是删除和创建新文档。我在这样的代码上运行基准测试,发现它可以提供帮助;但在所有情况下我都无法保证。很大程度上取决于应用程序中还有什么。