博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

Lotus开发基本性能优化

Posted on 2008-08-09 14:31  生鱼片  阅读(1253)  评论(0编辑  收藏  举报

一:一般的原则
1. 视图的数量和复杂度:尽量使用少量视图,去掉不必要的和相似的视图,视图列的公式等尽量简单化。
2. 尽量不要用@Today和@Now在视图的选择条件或是列公式上.
3. 数据库的文档数量不要太多:要及时做归档。
4. 文档中域的数量:过多的域会影响索引视图时的性能,即使该域没有在视图使用也会。
5. 正在修改的文档数量:会降低视图索引的性能。
6. 删除文档的数量:文档删除后会留下一个删除存根。当复制数据库时,Notes 会使用删除存根识别并删除复本中的该文档。 为了节省磁盘空间,Notes 会根据复制设置“删除最近 [ ] 天内未修改的文档”,从文档删除中清除余下的删除存根。如果 Notes 清除了尚未复制过的删除存根,则在下次复制后已删除的文档将再次出现。此选项位于 Notes 客户机的“文件”“复制”“设置”对话框中的“节省空间”面板上。有很多时候数据库中删除存根的数量比文档的数量还多,这种情况一般发生在比如有一个定时代理,他做的工作是删除该数据库中的文档并从外面的数据源创建新文档并存于该数据库中,我们尽量不要做这种动作。
7.读者域:会影响视图性能。
8.用户数量:很多的时候可以使用集群。

二:数据库级别

下面数据库属性对性能影响比较大
1. 不保留未读标记
2. 保留LastAccessed属性
3. 不支持指定的答复层次:如果该项未启用你就不能使用@AllDescendants,@AllResponses,这两个公式有时候会在视图的选择公式或复制公式中用到。
4. 禁用事务记录
5. 优化文档表格优化

如果你的domino数据存在DB2数据中,这并不会带来性能的提升,他所带来的只是功能的增强。

另外在数据库的ACL要限制用户的创建个人文件夹和视图的权限。用户创建的个人视图是存在工作台文件中的,并不是存在服务器上,数据库的个人视图或文件夹将用此图标存储在工作台中,而不是存储到服务器上的数据库中。从工作台删除图标将删除个人视图或文件夹。但是索引的时候需要将它们拉到服务器上,所以会影响性能。

三:公式方面性能优化

大部分的公式运行的速度都是比较快的,只有一少数部分需要时间比较长的计算,我们要注意使用,如下:
1.@Contains :这个公式不是很浪费资源,但是有的时候用这个公式判断的不是很准确,比如:@Contains(Cities;“Lansing”)如果Cities的值为“East Lansing”其返回的也是True,这个时候如果你想要准确的城市为Lansing的情况,你最好使用 = *= 或者@IsMember来代替,使用这些的时候如果第一个字符不匹配的话就不会在扫描了。
2.使用@Transform来代替@FOR和@While。
3. @Unique( textlist ),需要对比textList中的每一个值.
4.@NameLookup 和@DbLookup相似,只是仅查找names.nsf的。
5.@DbLookup,@DbColumn:
5.1使用缓存:我们开发的时候为了每次结果都是实时的,所以我们使用NoCache,但是正式环境中我们的更改并不会很频繁。
5.2选择正确的视图进行查找.
5.3避免重复查找:
5.3.1例如 @if(@IsError(@DbLookup(“”:”NoCache”;””;”SomeView”;CustID;3);””;) @DbLookup(“”:”NoCache”;””;”SomeView”;CustID;3))
上面说了用NoCache没必要,关键是上面的DbLookup要执行两次,所以可以使用如下方式:
_tmp:= @DbLookup(“”:””;”SomeView”;CustID;3);
@if(@IsError(_tmp);””;_tmp)
或者
@DbLookup(“”:””;”SomeView”;CustID;3;[FailSilent])
5.3.2做一些必要的判断,例如_t:=@if(@IsDocBeingEdited;@DbColumn(“”;””;”Customers”;1);@Return(@Unavailable));
@if(@IsError(_t);””;_t)

四:表单方面:

1. 表单中域的数量过多会影响性能,我们可以将域分组存在不不同的子表单中,这样可以根据需要来进行加载。
2. 表单不要放太多的图片
3. 不要使用存储表单。
4. 自动刷新域:表单的该选项要少用,因为该选项会使表单上的计算域,输入的验证公式在表单编辑等时候重新计算,我们最好的方式是使用“当关键字改变时刷新域”或是域的Onchange和Onblur事件。
5. 太多的共享的设计元素:使用共享的设计元素可以方便维护,但是缺点是过多会对性能有影响。Lotus Notes会有一个缓存来维护设计元素信息,也就是说并不是每次都是读取的原始的共享设计元素。共享操作和共享试图列对性能是没有影响的。

五:视图方面

1. 视图中的@Now和@Today:
使用@TextToTime(“Today”)是不完善的,因为这个公式只有第一天执行。
为什么呢?当你打开一个视图的时候,Lotus Notes会查看试图索引(存储视图中的文档列表和行的值),仅仅检查上次视图索引被更新后新建的文档和修改过的文档。看是否把他们加入到视图中,或是删除,或是其列值的重新计算。
然而如果你使用@Today,旧的视图索引就没有用了。比如我们的选择公式是:
Select Status=”Processing” & DueDate<=@Today
这个时候视图总是别更新为最新的。
如果你使用@TextToTime(“Today”)代替@Today,效率有了,不过就是不是最新的。这点我们可以结合视图属性中的索引设置来平衡。
2. 很多程序慢是因为程序中包括了很多视图。把没用的删除会提高速度。另外试图列也尽量不要太多。
3. 过度复杂的公式:选择公式。列公式 如果@For @While @Transform
4. 过度使用分类,视图索引等
5. 读者域:使用读者域会降低视图的性能,当你打开一个视图的时候Lotus Notes会去扫描每一行来觉得你是否有权限访问,即使该视图中你只有一个文档可以访问也要把整个视图的文档都扫描到的。
下面点是使用时要注意的:
5.1. 读者域值尽量短,比如使用角色代替名字列表。
5.2. 如果一个视图中只有一两个文档是该用户可以访问的,最好不要使用视图的方法,比如你可以给他他封mail,里面有该文档的link。
5.3. 可以使用@SetViewInfo来显示指定列中包含指定字符产的文档。
5.4.使用@UserName @UserRoles在共享视图的选择公式或是列公式是不会得到你想要的结果

六:程序方面。

1. GetNthDocument:使用NotesDocumentCollection的GetNthDocument来循环文档集中的文档是非常慢的,我们可以使用GetFitstDocument和GetNextDocument方法来替代完成。
2. 如果你在视图,表单,文件夹中使用了过多的操作也会影响性能,因为他们每次都会将所有的代码装载到内存中。所以我们尽量把代码写到代理里面,在操作中去调用代理。
3. 过多的Script库:装载10个Script库的时候要大于两次装载5个Script库的时间,尤其是Script中有”Use”其他Script库的情况。
装载两个Script库的时间要大于装载一个包含同样代码两的Script库,所以我们要尽量把功能相同的代码封装在一起。
4. ComputeWithForm:NotesDocument的方法ComputeWithForm会自动更新文档的计算域,但不幸的是速度非常慢,和手动设置一个新的域值相比。所以我们宁可多写几行代码。
5. 将NotesView类的AutoUpdate设为false
6. NotesDocumentCollection有几个已All结尾的方法,是对文档集中所有的文档做一些相关的操作,使用这些方法的速度要高于你去循环每一个文档去做一样的操作要快。
7. 少使用Variant类型的变量,最好使用Option Declare来限制所有的变量都要声明。
8. 使用Profile文档来存储一些配置,共享的信息.