疑難排解報表效能
新增: 2008 年 11 月 17 日
此主題描述您可以協助改善報表效能的方式。
若要疑難排解報表效能,請使用 Reporting Services 記錄檔來判斷花費大部分時間的作業:擷取資料、處理報表配置或轉譯報表。如需詳細資訊,請參閱<報表問題的疑難排解>。
判斷出花費大部分時間的作業之後,請使用下列各節來協助疑難排解特定問題。
改善資料擷取效能
改善報表處理效能
改善報表轉譯效能
改善資料擷取效能
報表資料越多,系統就會使用越多資源和儲存空間、建立越多網路流量,而且需要越多處理時間。若要協助控制報表效能,請設計具有合理資料量和複雜度的報表。例如,只有少數使用者想要檢視 1,000 頁的報表。如果資料表的巢狀層級太多,使用者會難以保存向下鑽研報表的內容;如果資料行太多,就會難以掃描資料表。具有數百個配量的圓形圖會顯得很擁擠而且難以閱讀。因此,請仔細地分析您的報表需求來判斷所需的資料量,然後僅從報表資料來源中擷取該項資料。
您可以使用下列各節中的資訊來協助減少擷取報表資料所花費的時間。
擷取比您需要更多的資料
針對資料來源篩選、排序和彙總大量資料會比在報表處理期間進行這些作業更有效率。您可以撰寫查詢,以便僅傳回想要顯示在報表中的資料。如果您打算僅顯示摘要資料,請針對資料來源計算彙總,而不要擷取詳細資料。下列清單會建議在報表中評估每個報表查詢的觀念:
- 您可以使用 WHERE 子句或 HAVING 子句來撰寫查詢,以便將資料限制為只有使用者必須在報表看見的資料。請使用查詢參數來限制在執行階段擷取的資料。如需詳細資訊,請參閱<使用 WHERE 和 HAVING 篩選資料列>。
當您建立具有篩選資料之報表參數的快照集報表時,可能會顯示在報表中之所有可能資料都必須儲存在快照集中。在此情況下,請勿在資料集查詢中使用查詢參數。請改為手動建立您可以用於篩選運算式的報表參數,讓使用者指定他們所需的報表資料。 - 您可以使用 ORDER BY 子句來撰寫查詢,以便預先排序針對報表所擷取的資料。請按照您想要資料在報表中排序的順序排序資料。預先排序的資料會因資料儲存在記憶體中的方式而改善報表處理時間。許多報表處理工作都不需要在處理之前排序資料。例如,SUM 不會相依於排序次序。群組執行個體內部的資料不會自動排序。如果您不需要在報表中排序資料,請勿針對資料集或資料區設定排序運算式。如需詳細資訊,請參閱<ORDER BY 子句 (Transact-SQL)>和<在報表中排序資料>。
不過,在報表中排序群組或依照彙總值排序會比在查詢中排序更簡單。通常,在報表中排序群組會比在查詢中排序群組更有效率。 - 您可以使用 GROUP BY 來撰寫查詢,以便針對資料來源彙總值。
在許多情況下,傳達資訊最有效的方式就是透過彙總值和顯示摘要。您可以針對資料來源計算部分彙總層級,然後擷取資料集的這些彙總層級。此時,資料集的「詳細」資料就表示針對資料來源所計算的彙總。如需有關在查詢中彙總的詳細資訊,請參閱<摘要查詢結果 (Visual Database Tools)>。
當這些預先彙總值存在報表中之後,只要使用在數學上可轉移的彙總函數 (例如 SUM),您就可以繼續彙總這些值。例如,假設您有一組 6 個值:1、2、3、4、5、6。如果您將這些值組成配對,就會有一組 3 個值:3、7、11。您可以計算第一組的總和 (21),然後計算第二組的總和 (21)。這些總和都是相同的,不論是否組成群組都一樣。如果您使用 AVG 函數來計算這些值組的平均值,就會針對每一組取得不同的結果。6 這組的平均值是 21/6 或 3.5。3 這組的平均值是 21/3 或 7。AVG 並非可轉移函數。 - 您可以考慮分析和最佳化資料來源的查詢效能。例如,若要了解有關 SQL Server 2005 查詢最佳化工具的詳細資訊,請參閱<查詢效能>和<單一 SQL 陳述式處理>。
- 您可以考慮圖表所需的資料量。在折線圖中,如果您在監視器的少數像素中繪製數百個點,就會降低效能而且不會強化圖形的視覺顯示。在圓形圖中,超過 7 或 8 個配量都是有問題的值。
- 若為具有條件式可見性的報表項目,報表處理器就必須套用群組、排序和篩選運算式,即使只有最上層資料優先顯示也一樣。如果使用者只有偶爾想要查看詳細資料,鑽研報表就是較佳的選擇。在使用者按一下主報表中的鑽研連結之前,鑽研報表不會執行。鑽研報表或子報表會處理所有資料,即使資料一開始隱藏也一樣。如需詳細資訊,請參閱<將連結加入至報表>。
- 您可以考慮建立報表的執行快照集。報表快照集含有針對報表定義中之資料集所擷取的所有報表資料。如需詳細資訊,請參閱<報表快照集>。
大量網路流量會導致較長的等候時間
將大量資料當做網路流量傳遞可能會延長使用者的等候時間。如果您知道預期的基本使用者和預期的報表檢視量,就可以針對部署報表伺服器元件選取適當的方法。
請考慮採用下列策略來協助減少使用者的等候時間:
- 將報表伺服器資料庫和報表伺服器都保存在同一部電腦上。
報表伺服器資料庫 tempdb 會管理針對每個資料集查詢所擷取的報表資料。您可以將 tempdb 保存在報表伺服器上,以便減少可能會降低報表執行速度的網路流量。 - 若為資料倉儲的資料來源,請將資料倉儲和報表伺服器保存在不同的伺服器上。
雖然透過網路擷取資料不會增加報表執行的額外工作,不過將資料倉儲和 Reporting Services 保存在同一部伺服器上可能會降低效能,因為它們都會爭用記憶體。
如需詳細資訊,請參閱<規劃 Reporting Services 部署>。
查詢逾時
如果資料集查詢在它能夠擷取資料之前逾時,您可以在報表中指定逾時值。根據預設,此值設定為 30 秒。若要設定資料集查詢的逾時值,請參閱<如何:建立資料集 (報表設計師)>。如需詳細資訊,請參閱<設定報表執行的逾時值>。
改善報表處理效能
擷取報表資料集和報表參數的資料之後,系統就會進行報表處理。報表處理器會結合報表配置和資料來建立暫時報表格式,然後再將此格式傳遞給報表轉譯器。在具有許多執行個體的報表項目中,報表處理時間可能會受到報表配置、分頁和複雜運算式的影響。您可以使用本節來協助改善報表處理效能。
選擇正確的資料區
請盡可能使用資料表和清單資料區。處理資料表或清單會比處理矩陣更有效率。資料表和清單資料區僅支援資料列的動態元素。矩陣配置則同時支援資料列和資料行的動態元素,因而建立更複雜的配置結構。
避免在實體頁面轉譯器的頁首或頁尾中使用總頁數值
當報表是由針對實體頁面進行分頁的配置轉譯延伸模組 (例如 PDF 或影像) 所轉譯時,全域欄位 TotalPages 的參考可能會影響報表處理效能。如需有關轉譯器的詳細資訊,請參閱<報表轉譯的設計考量>。
使用複雜資料區群組和彙總函數
如果資料表或矩陣資料區有許多巢狀群組層級,可能會影響報表處理效能。請考慮套用群組、篩選和排序運算式之後,需要評估的群組層級、群組執行個體的數目,以及彙總函數的使用方式。
請避免使用*「排序後」*(Post-sort) 彙總。排序後彙總會相依於排序次序而且包含下列函數:Previous、First、Last 和 RunningValue。當您在運算式中加入其中一或多個函數時,報表處理器就必須先排序目標資料,然後再套用函數。在具有複雜群組定義 (例如多個巢狀或相鄰群組) 的矩陣配置中,請盡可能避免在運算式中加入排序後彙總。
您可以評估報表設計並且考慮是否能夠針對資料來源進行某些資料彙總。減少報表的資料量可能就足以提供可接受的效能,而不需要變更任何彙總函數呼叫。
如需有關彙總函數的詳細資訊,請參閱<在運算式中使用報表功能 (Reporting Services)>。
在運算式中指定不必要的遞迴
只有當您要定義遞迴階層 (例如顯示經理和員工的組織報表) 時,才應該指定群組的父系運算式。Parent 屬性只會套用至遞迴資料。Parent 屬性不會明確套用至巢狀群組的父子式關聯性。
在含有許多資料列的資料區中使用子報表
您應該了解使用子報表的優缺點。每個子報表執行個體都是個別的查詢執行和個別的報表處理工作。
- 如果子報表執行個體只有少數,請在資料區中使用子報表。
- 如果群組執行個體很多,請避免在資料區群組中使用子報表。例如,若要顯示每位客戶的銷售和獲利清單,請考慮使用鑽研報表。您應該考慮是否能夠撰寫查詢,以便聯結客戶資料與銷售和獲利資料,然後再依照客戶識別碼進行分組。
- 當子報表與主報表使用不同的資料來源時,請勿使用子報表。如果效能發生問題,請考慮使用下列其中一項策略來變更主報表的資料集查詢:
- 收集資料倉儲中的資料,然後使用資料倉儲當做單一資料集的資料來源。
- 使用 SQL Server 連結的伺服器並且撰寫從多個資料庫中擷取資料的查詢。
- 使用 OPEN ROWSET 功能來指定不同的資料庫。
使用互動式排序
除非使用者需要在報表中變更資料排序次序的功能,否則請避免使用互動式排序按鈕。
使用影像
您應該了解影像的資源需求。
- 請避免使用大型影像,包括背景影像。大型影像需要記憶體、處理和轉譯資源,尤其當它們轉譯至 PDF、列印或文件影像等複本轉譯器時,更是如此。
- 請避免使用許多來自資料庫或伺服器之小型影像的執行個體,例如關鍵效能指標 (KPI)。您可以將這些影像當做內嵌影像包含在報表中。
- 若為具有許多影像的報表,請將影像的 AutoSize 設定為不同的值,例如 Fit。
在報表伺服器上爭用相同記憶體的處理序
在報表伺服器上爭用相同記憶體資源的多個應用程式可能會影響報表處理。
請和系統管理員一起確認記憶體管理組態是否為適合報表伺服器使用的正確模型。如需詳細資訊,請參閱<設定 Reporting Services 可用的記憶體>。
報表執行逾時
為了執行大型報表,您必須調整兩個逾時:報表執行逾時和 ASP.NET 逾時。
報表執行逾時值是在報表伺服器上指定的。如需詳細資訊,請參閱<設定報表執行的逾時值>。
ASP.NET 逾時原則是由報表伺服器組態檔控制的。這個檔案的預設位置是 <drive>:\Program Files\Microsoft SQL Server\MSSQL.n\Reporting Services\ReportServer\web.config。若要設定要求可執行的最大秒數,請將 httpRuntime 元素設定為以秒為單位的逾時值。下列 XML 片段會顯示要在組態檔中加入這個元素的位置:
<configuration>
. . .
<system.web>
. . .
<httpRuntime executionTimeout="90"/>
. . .
</system.web>
. . .
</configuration>
若為長時間執行的查詢或複雜報表,您可能必須指定表示許多個小時的值。
改善報表轉譯效能
報表轉譯會在資料和配置結合並傳遞給轉譯延伸模組之後進行。轉譯時間會取決於資料量、報表項目的執行個體數目和頁面大小而定。報表轉譯器會決定頁面上可容納的資料量。頁面的定義會因轉譯器而不同。Excel 轉譯器的頁面是工作表。PDF 轉譯器 (可列印報表) 的頁面是實體頁面。HTML 檢視器的頁面可能是整份報表。列印頁面的報表設計可能會與線上檢視的報表設計不同。如果您預期使用者將以特定格式檢視報表,請針對該格式設計報表。如需詳細資訊,請參閱<報表轉譯的設計考量>。
下表將建議可協助改善報表轉譯效能的方式。
轉譯格式 | 描述 |
---|---|
全部 |
|
Excel |
|
HTML |
|
影像 TIFF 列印 |
|
如果以某種格式轉譯報表時遇到問題,請選取產生較小檔案的格式 (例如 CSV)。若為已發行的報表,您可以在 URL 中指定轉譯格式。如需詳細資訊,請參閱<Specifying a Rendering Format in a URL>。
如果因為無法使用報表工具列,所以不能選取另一種格式,此時可以定義訂閱來設定轉譯格式,並將報表當成靜態文件傳遞至檔案共用。如需詳細資訊,請參閱<Reporting Services 中的檔案共用傳遞>。
請參閱
概念
其他資源
Reporting Services 的疑難排解
Reporting Services 錯誤和事件
報表問題的疑難排解