Lotus開發性能優化 (I)

 

一:一般的原則
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文檔來存儲一些配置,共享的信息.

發佈了5 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章