設計優化的 Web 報表
Crystal Reports 本身的性能優點:
- 按需分配頁技術
按需分配頁的報表訪問允許用戶只下載需要查看的特定報表頁,從而縮短了響應時間,減少了 Web 流量。不僅如此,占位符和部分頁技術還使您無須等待圖形和子報表等大對象的處理,就能立即查看 Web 上的報表頁和數據。
- 優化的多線程報表引擎
Crystal Report 引擎的多線程能力及線程安全數據庫驅動程序使您能夠在許多其他操作在后臺進行的同時,繼續執行您自己的重要任務。此外,報表引擎減少了數據傳遞次數,通過改善的內存管理來加快處理速度,盡可能高效處理子報表和參數。
優化 Web 報表的關鍵策略
通過 BusinessObjects Enterprise 縮放。
計劃
BusinessObjects Enterprise 包含一個靈活的基于時間和事件的調度系統,使您可以在工余時間處理大的報表,從而避免不必要的數據庫訪問。(Report Application Server 提供按需制表功能,每個查看請求都會產生一個單獨的數據庫查詢)。
版本管理
版本管理和調度功能緊密配合,共同實現報表實例的存儲。版本管理不僅可以降低為服務用戶而造訪數據庫的次數,而且可以保留報表實例的檔案作為歷史參考。
集群
BusinessObjects Enterprise 整合了成熟的集群和負載平衡技術,可幫助您實現一個高度易用、性能可靠的信息傳送系統。
可伸縮性
BusinessObjects Enterprise 建立在分布式多服務器結構的基礎上,可使您通過單機擴容(添加處理器)或多機擴展來處理較重的用戶負載。
管理
BusinessObjects Enterprise 包含大量的管理控件,可用來組織內容,設置復雜的調度和安全性,并調節系統達到最佳性能。
外部(第三方)身份驗證
BusinessObjects Enterprise 允許您利用現有安全系統來管理用戶和組。所有身份驗證工作都可委托給第三方 NT 或 LDAP 系統。
BusinessObjects Enterprise 中日期函數的求值時間
Crystal Reports 中可用的不同日期和時間函數是在報表處理的不同階段求值的。某些函數是在處理預定的報表或刷新報表實例時求值的:該求值時間稱為“WhileReadingRecords”。其他函數是在每次格式化報表頁以在報表查看器或瀏覽器中顯示時求值的:該求值時間稱為“WhilePrintingRecords”。
如果使用 BusinessObjects Enterprise 生成報表實例,并且注意到所求出的日期或時間函數值不是預期值,請考慮以下因素:
- 當前日期和時間始終是從報表引擎可以在本地訪問的時鐘(即處理報表的計算機上的時鐘)中讀取的。在 BusinessObjects Enterprise 中,“作業服務器”依據數據庫處理預定報表,而“頁面服務器”依據數據庫處理按需要顯示的報表。Page Server 還在用戶查看報表實例的個別頁面時對頁面進行格式化。
- 在處理預定報表時,Job Server 將對所有日期和時間公式進行求值,以便生成報表實例。如果只是查看生成的報表實例,則不會對任何公式重新求值。
- 當您查看緩存的報表頁時,不會對任何日期函數重新求值,原因是記錄已被讀取并且頁面已被格式化。
- 如果在報表的選定公式中使用日期和/或時間函數,則報表數據依賴于這些公式的返回值。因此,在以后某個日期查看報表實例時,函數可能會導致系統依據數據庫對報表數據進行更新。
- 若要確保日期和時間函數返回預期的值,可以通過使用 WhileReadingRecords 和 WhilePrintingRecords 函數來強制確定求值時間。
作出正確的設計選擇。
在設計報表,尤其是設計用于 Web 的報表時,應該允許報表用戶操縱其所查看的數據。即,顯示匯總信息,以便每個用戶可以快速地瀏覽報表,然后深化以訪問其他數據。采用此方法,由于僅從數據庫服務器傳輸用戶所請求的數據,所以最大限度地降低了 Web 流量并縮短了響應時間。
下面只是設計用戶驅動報表的幾點優勢:
- 報表用戶可以對其在 Web 上查看的信息類型和數量進行交互控制。
- 因為只從數據庫服務器返回用戶所請求的信息,所以數據傳輸和網絡流量減少。
- 當用戶需要通過 Web 根據實時數據制作報表時,面向用戶的報表響應迅速,并能有效地與數據庫服務器通訊。
- 報表變得更有用,原因在于每個用戶均可自定義報表的內容,從而創建針對其特定決策問題的報表解決方案。
使用更快的報表格式
要提高在 Crystal Reports 舊版本中創建的報表的性能,最快速的方法是將其以最新的 Crystal Reports 格式保存。Crystal Reports 在經過改進后,已能較以往更快地處理報表:更新舊報表可利用這些改進功能。
若要更新舊報表的格式,只需用 Crystal Reports 將其打開,然后從“文件”菜單中選擇“保存”。舊版本的報表將被替換為版本 11 的報表。
在實時數據和已保存數據之間選擇
設計匯總報表
設計和分發摘要報表是確保用戶可以在 Web 上快速查找所需數據的一種相對簡便的方法。摘要報表可以包含的數據與其他任何報表一樣多。但是,通過隱藏匯總報表的“詳細資料”節,可以避免用戶陷入他們可能并不直接需要的數據中。
在 Crystal Reports 中打開報表。
如果尚未創建分組及匯總的報表,則從“Feature Examples”樣本文件夾中打開“Group.rpt”。
在“報表”菜單上,單擊“節專家”打開“節專家”。
在“節”列表中,單擊“詳細資料”。
在“節專家”的“公用”選項卡上,選中“隱藏(深化完成)”復選框。
單擊“確定”。
慎用子報表
利用按需分配子報表
如果報表有處理大量記錄的節,則可以將該節放入按需分配子報表中。按需分配子報表在主報表中以超級鏈接的形式出現。在打開主報表時,不會檢索按需分配子報表的任何數據,直到深化相應的超級鏈接為止。
使用鏈接子報表
當鏈接子報表時,Crystal Reports 會根據主報表中的匹配記錄協調子報表中的數據。
鏈接表而不是鏈接子報表
只要可能,就應采用以下方法協調報表數據:將“數據庫專家”中“鏈接”選項卡上的數據庫表鏈接到主報表,而不是將常規子報表(即非按需分配子報表)鏈接到主報表。因為每個子報表都是作為單獨的報表運行,所以鏈接的表常常有性能優勢。
有效地使用其他設計元素
映射
映射呈現是一種單線程操作,它的縮放性能并不好。盡管支持映射,但您仍然需要仔細考慮報表中的映射將對性能產生的總體影響。
報表模板
如果將對多個報表應用同一模板,最好將報表模板打開一次,然后將其保存在緩存中,這是因為模板只需要為只讀。
包括“第 N 頁,共 M 頁”或“總頁數”
如果在報表中包括特殊字段“第 N 頁,共 M 頁”或“總頁數”,則報表需要先完成處理,然后才能計算此值。除非報表非常小或者的確需要此值,否則,請避免使用這些特殊字段。
設計報表以最大程度地利用數據共享
BusinessObjects Enterprise 具有數據共享功能,通過減少具有多個用戶的系統中進行的數據庫調用次數來提高性能。
只有在滿足某些條件時,才能在報表對象的用戶之間共享數據。在不損害用戶的報表信息需求的情況下,嘗試通過設計盡可能滿足數據共享條件的報表來最大程度地利用數據共享。
如果報表由頁面服務器處理,則在滿足以下條件時將會在報表用戶之間共享數據:
- 用戶使用相同數據庫登錄信息查看報表時。
- 用戶使用相同參數查看報表時。
- 用戶使用相同頁面布局選項查看報表時。
- 用戶使用相同區域設置查看報表時。
使用 DHTML 查看器、ActiveX 查看器或 Java 查看器查看的報表是使用頁面服務器處理的。這些查看器不允許用戶更改報表的頁面布局或區域設置。但是,可以開發提供此功能的自定義查看器應用程序。
如果報表由報表應用程序服務器 (RAS) 處理,則在滿足以下條件時將會在報表用戶之間共享數據:
- 用戶使用相同數據庫登錄信息查看報表時。
- 用戶使用相同參數查看報表時。
- 用戶使用相同區域設置查看報表時。
- 用戶不修改報表時。
使用高級 DHTML 查看器(或允許查看或修改報表的自定義應用程序)查看的報表是使用報表應用程序服務器處理的。
優化您的制表環境
選擇最快的數據庫和連接
若要提高制表性能,應充分利用數據庫進行大部分報表處理工作。理想情況下,結構化查詢語言 (SQL) 數據庫是執行這類任務最有效的數據庫。
使用表索引
要使處理速度達到最快,可基于 SQL 數據庫中帶索引的字段創建報表。使用表索引很容易提高數據的訪問速度,減少 Crystal Reports 計算數據所花的時間。
改進表鏈接選擇
1. 確保每個數據庫表在要使用的字段上編制了索引。
2. 將數據庫表添加到您的報表,然后在公用字段上鏈接主表和查閱表,而不要插入鏈接子報表再將其綁定到主報表的數據。
3. 在主表中,使用對索引字段設置了范圍限制的記錄選定公式。這樣可以減少 Crystal Reports 必須在查閱表中找到的與主表中記錄相匹配的記錄的數目。
使用線程安全數據庫驅動程序
使用存儲過程進行更快的處理
使用增強的記錄選定公式
下推記錄選定
Year ({訂單.訂單日期}) < 2001 返回所有DB記錄;{訂單.訂單日期} < #Jan 1, 2001# 只返回所需記錄
記錄選定性能提示
在設置記錄選定請求時,請考慮下列與性能相關的項目:
常規
- 要下推記錄選定,必須在“報表選項”對話框(從“文件”菜單打開)中選中“為提高速度而使用索引或服務器”。
- 在記錄選定公式中,避免在非參數字段的字段上進行數據類型轉換。
例如,避免使用 ToText( ) 將某數值數據庫字段轉換為字符串數據庫字段。
- 能夠下推一些使用常量表達式的記錄選定公式。
PC 數據庫
- 只能下推編有索引的字段上的記錄選定。
- 只能下推 AND 子句(非 OR)。
SQL 數據庫
- 能夠下推索引字段或非索引字段上的記錄選定。
- 如果使用索引字段,SQL 服務器響應速度將加快。
- 能夠下推 AND 和 OR 子句。
- 可以下推包含某些類型的嵌入公式的記錄選定公式。
- 應該合并 SQL 表達式字段以下推進行記錄選定所需的公式計算。
- 在“數據庫”菜單上單擊“顯示 SQL 查詢”,以查看將要發送到數據庫服務器的 SQL。
編寫高效記錄選定公式的策略
考慮 1
任何完全用“選擇專家”生成、而不是自己編寫的記錄選定公式,都可以下推。
考慮 2
任何具有 DataBaseField SupportedOperator ConstantOrParameterExpression 形式的選定公式均可下推。
當然,DataBaseField 只是一個數據庫字段。SupportedOperator 是 =、<>、<、<=、>、>=、StartsWith、Like 或 In 之中的任何一個。
ConstantOrParameterExpression 是涉及常量值、運算符、函數和參數字段的任何表達式。它不能包含變量、控制結構或參數字段以外的字段。根據其本身定義,常量表達式和參數表達式可以無須訪問數據庫而求得。
注意: 常量或參數表達式的求值結果可以是簡單值、區域值、數組值或一個區域值數組。這類表達式的舉例如下:
{?number parameter} - 3
Year ({?run date})
CurrentDate + 5
DateDiff ("q", CurrentDate, CDate("Jan 1, 1996"))
Month (Maximum ({?date range parameter}) + 15)
["Canada", "Mexico", "USA", {?enter a country}]
1000 To 5000
[5000 To 10000, 20000 To 30000, 50000 To 60000]
一個完整的示例:
{訂單.訂單日期} >= CurrentDate - 3
該程序還可下推只包含布爾字段(不包含運算符和常量部分)的表達式。
{訂單.已發貨}
Not {訂單.已發貨}
考慮 3
IsNull (DataBaseField) 可以下推。
考慮 4
SqlExpression SupportedOperator ConstantOrParameterExpression 可以下推。例如,如果 {@ExtendedPrice} = (Quantity * Price)
,則選定公式 {@ExtendedPrice} > 1000
不能下推。但是,如果用等價的 SQL 表達式代替 @ExtendedPrice
,則該選定公式可以下推。
考慮 5
當使用遵循上述考慮因素編寫的多個表達式時,將其用 AND 和 OR 分開,也可以使用 NOT。每種表達式可以有多個,并用括號確定優先級。例如:
{Orders.Order ID} < Minimum({?number range}) Or
{訂單.訂單金額} >= 1000
(IsNull({客戶.地區}) Or
{客戶.地區} = "BC") And
{客戶.去年銷售額} > 2000
將參數字段合并到記錄選定公式中
不要在每次打開報表時均顯示報表的所有數據,可以創建參數字段提示用戶指定希望查看的數據。為了減少從數據庫服務器傳輸的數據量,請將這些參數字段直接合并到記錄選定公式中。
一般情況下,參數字段為用戶提供交互性,用戶響應參數提示以指定希望查看的數據。但是,通過將參數字段直接合并到記錄選定公式中,將不僅提供交互性,而且減少了數據傳輸并改善了性能。
可以通過“選擇專家”或“記錄選定公式工作室”向記錄選定公式添加參數字段。當使用“記錄選定公式工作室”時,可將參數字段和其他任何字段一樣對待。
適時使用 SQL 表達式
為了維持最佳的報表處理速度,請避免在記錄選定公式中使用公式(不管是 Crystal 語法還是 Basic 語法)。而應該用等效的 SQL 表達式字段替換原公式,然后將 SQL 表達式字段合并到記錄選定公式中。這樣做將大大提高您的記錄選定被下推到服務器的機會。
另外,應避免對公式字段進行排序、分組或總計(不管是 Crystal 語法還是 Basic 語法)。而應該用等效的 SQL 表達式字段替換原公式字段,然后在 SQL 表達式字段上進行排序、分組或總計。這樣做也將大大提高在服務器上執行處理的機會。
最后,如果數據庫支持 Case 邏輯,并且報表需要摘要 If-Then-Else 公式計算,請用 SQL 表達式字段替換該公式。
改進分組、排序和總計
在服務器上執行分組
當通過 Web 從活動數據中進行實時制表時,使用選項“在服務器上執行分組”可減少從數據庫服務器傳輸的數據量。使用此選項后,大部分數據處理工作都卸載到數據庫服務器,并且開始時僅讀入一個數據子集。僅當您在報表中進行深化時才從數據庫返回詳細數據。
注意: 服務器端處理僅適用于那些基于 SQL 數據源的經過排序和分組的報表。
啟用服務器端處理
- 在“文件”菜單中,單擊“報表選項”。
- 選擇“報表選項”對話框中的“在服務器上執行分組”。
如果沒有選擇“為提高速度而使用索引或服務器”,則該復選框是不活動的。
提示: 當選中“為提高速度而使用索引或服務器”后,您可以迅速從“數據庫”菜單啟用“在服務器上執行分組”。
- 單擊“確定”。
將 SQL 表達式用于分組、排序和總計
將 SQL 表達式用于 Case 邏輯
如果數據庫支持 Case 邏輯,并且報表需要對 If-Then-Else 公式計算進行匯總,請用 SQL 表達式字段替換該公式。在此類情況下,SQL 表達式字段使 Crystal Reports 可以在服務器上執行報表的分組。
例如,假設您正在從支持 Case 邏輯的 MS SQL Server 7 數據庫中制作報表。您需要在報表中包含一個 If-Then-Else 計算,并且對報表中每個組的計算進行匯總。通過使用如下形式的 SQL 表達式字段執行計算,您就利用了數據庫的能力來處理 Case 邏輯:
CASE DatabaseTable."DatabaseField"
WHEN 'SpecifiedValue' THEN Calculation1
ELSE Calculation2
END
如果記錄的 DatabaseField 值等于 SpecifiedValue 值,則執行 Calculation1;對于所有其他記錄則執行 Calculation2。通過包含 SQL 表達式字段,您利用了數據庫服務器的能力來處理 Case 邏輯。甚至當您在報表的其他地方對該 SQL 表達式字段進行匯總時,報表的分組也將隨之在服務器上進行。
在可能的位置插入匯總和運行總計字段
可能的情況下,應避免創建包含全局變量的公式來計算匯總或運行總計。
相反,應通過單擊“插入”菜單然后選擇相應的命令(小計、總計和匯總)來創建匯總。通過打開“字段資源管理器”,右擊“運行總計字段”,然后從快捷菜單中選擇“新建”來創建運行總計字段。