報表疑難排解:報表效能

當您檢視報表時,可能要等上好一陣子才會出現第一頁。如需協助以判斷報表處理時間花在哪裡,請參閱<報表問題的疑難排解技術>。判斷出延遲時間是花在資料擷取、報表處理或報表轉譯之後,您可以使用本主題來協助對問題進行疑難排解。

資料擷取時間過長

報表處理時間過長

報表轉譯時間過長

最佳化報表處理的設計秘訣

資料擷取時間過長。

報表資料越多,就需要使用更多的資源、網路流量、處理時間和儲存空間。分析報表中出現的問題以決定您所需要的資料量,然後只從報表資料來源擷取您需要的資料。

擷取的報表資料超過所需

對資料來源進行篩選、排序和彙總,比執行報表處理更有效率。請針對報表上顯示的資料詳細程度撰寫查詢,只傳回必要資料。下列清單為報表中各報表查詢提供評估建議:

  • 使用 WHERE 子句或 HAVING 子句撰寫查詢,將資料只限制在使用者必須在報表中看到的資料。使用查詢參數限制執行階段擷取的資料。查詢參數會自動繫結到對應的報表參數,並且讓使用者決定感興趣的資料。如需詳細資訊,請參閱<使用 WHERE 和 HAVING 篩選資料列>。

    當您建立快照集報表而其中包含會篩選資料的報表參數時,所有可能顯示在報表中的資料都必須儲存在快照集中。在此情況下,請勿在資料集查詢中使用查詢參數。請改以手動方式建立可用於篩選運算式的報表參數,讓使用者指定所需的報表資料。

  • 使用 ORDER BY 子句撰寫查詢,預先排序為報表擷取的資料。根據您要的報表資料排序順序,對資料進行排序。預先排序的資料是在記憶體中排序,因此可以加快報表處理時間。許多報表處理工作不需要在處理資料前進行排序。例如,SUM 便不根據順序而定。群組執行個體中的資料不會自動排序。如果您不需要排序的報表資料,請勿在資料集或資料區上設定排序運算式。如需詳細資訊,請參閱<ORDER BY 子句 (Transact-SQL)>和<如何:在資料區域中排序資料 (報表產生器 3.0 和 SSRS)>。

    如果要排序群組或依彙總值排序,在報表中排序比在查詢中排序簡單,而且通常也更有效率。

  • 使用 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 不是轉換函數。

  • 考慮圖表或量測軌所需的資料量。在螢幕上以少許像素繪製數百個點,不僅會降低效能,而且也無助於加強圖形的視覺顯示。圓形圖中的扇區若超過 7 或 8 個,已經是有問題的值。如需詳細資訊,請參閱<圖表類型 (報表產生器 3.0 和 SSRS)>中所列的特定圖表類型資訊。

  • 對於具有條件式可見性的報表項目,儘管一開始只顯示最上層資料,報表處理器還是必須套用群組、排序和篩選運算式。雖然 SQL Server 2008 Reporting Services 中的視需要處理功能可以只處理可見資料以達到最佳化資料評估,所有可能的資料仍屬於報表。如果使用者只想看到某段時間的詳細資料,鑽研報表是個更好的選擇。如需詳細資訊,請參閱<報表類型>。

  • 考慮建立報表的執行快照集。報表快照集包含為報表定義中之資料集所擷取的所有報表資料。如需詳細資訊,請參閱<建立、修改及刪除報表記錄中的快照集>。

查詢逾時

查詢逾時值是在報表撰寫期間,您定義資料集時所指定的。逾時值會與報表一起儲存在查詢的 Timeout 元素中。依預設,此值設定為 30 秒。如需詳細資訊,請參閱<設定報表和共用資料集處理的逾時值 (SSRS)>。

若要設定資料集查詢的逾時值,請參閱<如何:建立共用資料集或內嵌資料集 (報表產生器 3.0 和 SSRS)>。

大量網路流量造成使用者等候時間

大量資料在網路上流傳時,會造成使用者等候時間。您可以根據您預期的使用者基礎與報表檢視量,選擇適當的方法來部署報表伺服器元件。如需詳細資訊,請參閱<規劃部署拓撲>。

例如,下列策略可能有助於減少使用者等候時間:

  • 將報表伺服器目錄保存在與報表伺服器相同的電腦上。

    報表伺服器資料庫 tempdb 會管理為報表定義中各資料集查詢所擷取的報表資料。將報表資料與報表處理器保存在一起,可以減少網路流量,以免減緩報表執行速度。

  • 對於資料倉儲資料來源,將資料倉儲保存在與報表伺服器不同的伺服器上。

    雖然跨網路擷取資料,會為報表執行帶來額外的工作,但是將資料倉儲與佔用記憶體的 Reporting Services 放在相同伺服器上會減緩效能。

報表處理時間過長。

擷取報表資料集的資料之後會開始進行報表處理,此時報表處理器會結合報表配置與資料,建立暫時的報表格式以傳送到報表轉譯器。一般而言,報表處理器只會結合使用者目前檢視頁面的資料與配置。報表處理時間會受到下列因素影響:報表配置、分頁以及具有多個執行個體之報表區域內的複雜運算式。

請使用本節來協助改進報表處理效能。

頁首或頁尾中的運算式會強迫處理所有頁面

當您加入內建欄位 [&TotalPages] 參考時,報表處理器必須將整個報表分頁,然後才能轉譯第一頁。如果沒有 [&TotalPages] 參考,報表處理器可以立刻轉譯第一頁並傳回給使用者,而不必先處理報表其餘頁面。此外,報表處理器會假設頁首或頁尾中的任何複雜運算式,都可能包含 [&TotalPages] 的直接或間接參考。

若要避免讓報表處理器對冗長的報表進行分頁,請勿在頁首和頁尾中加入 [&TotalPages] 參考或任何複雜運算式。

報表中沒有分頁符號

隨著使用者在報表中逐次翻頁,報表處理器會結合各報表頁面的資料與報表配置資訊,然後將頁面傳送到報表轉譯器。對於沒有分頁符號的報表,必須先將整個報表處理完畢之後,使用者才能檢視第一頁。

自動分頁轉譯器 (例如 HTML 檢視器) 會為您自動處理分頁。若要覆寫這個自動行為並將報表設為一頁,您可以將報表屬性 InteractiveHeight 設為 0。至於手動分頁轉譯器,您必須手動新增分頁符號。如需有關轉譯器類型的詳細資訊,請參閱<了解轉譯行為 (報表產生器 3.0 和 SSRS)>。

確認 InteractiveHeight 不是 0,而是設為合理的頁面大小,例如 8.5 in。新增分頁符號至報表項目或 Tablix 群組,協助將報表分頁。這可以減少每一頁必須處理的資料量。如需詳細資訊,請參閱<如何:加入分頁符號 (報表產生器 3.0 和 SSRS)>。

複雜的 Tablix 資料區群組與彙總函式

Tablix 資料區內如果有許多層巢狀及相鄰群組,可能會影響報表處理效能。請同時考慮群組層級、群組執行個體數量,以及在套用群組、篩選和排序運算式之後需要評估的彙總函式用法。例如,Previous 是一個「耗費成本」的彙總函式,因為它的值根據資料區的排序元素而定;而 Sum 函數則不根據順序而定,需要的資源也較少。其他事後排序的彙總函式包括 First 和 Last。如需詳細資訊,請參閱<彙總函式參考 (報表產生器 3.0 和 SSRS)>。

評估報表上的報表設計,並考慮某些資料彙總是否可在資料來源上進行。減少報表上的資料量,可能不必變更任何彙總函式呼叫,便足以提供可接受的效能。

Tablix 資料區中的過多子報表執行個體減緩報表效能

了解使用子報表的優缺點。每一個子報表執行個體都是個別的查詢執行及個別的報表處理工作。

  • 如果只有少數子報表執行個體,請勿使用子報表。

  • 如果有許多群組執行個體,請勿在群組中使用子報表。例如,若要同時顯示每位客戶的銷售與退貨清單,請考慮使用鑽研報表。請考慮您是否能撰寫查詢,將客戶與銷售和退貨資料聯結後,再依客戶識別碼分組。

  • 當子報表使用與主要報表不同的資料來源時,請勿使用子報表。如果有效能問題,請考慮使用下列其中一種緩和策略來變更主要報表中的資料集查詢:

    • 收集資料倉儲中的資料,並使用資料倉儲做為單一資料集的資料來源。

    • 使用 SQL Server 連結的伺服器,並撰寫可從多個資料庫擷取資料的查詢。

    • 使用 OPEN ROWSET 功能指定不同資料庫。

處理序爭用報表伺服器上的相同記憶體

如果有多個應用程式爭用報表伺服器上的相同記憶體資源,報表處理會受到影響。

請與系統管理員一起確認,您使用的記憶體管理組態模型是否適用於您的報表伺服器。如需詳細資訊,請參閱<設定報表伺服器應用程式的可用記憶體>。

報表執行逾時

若要執行大型報表,有兩種逾時必須調整:報表執行逾時和 ASP.NET 逾時。

報表執行逾時值指定於報表伺服器上。如需詳細資訊,請參閱<設定報表和共用資料集處理的逾時值 (SSRS)>。

ASP.NET 逾時原則由報表伺服器組態檔控制。此檔案的預設位置是 <磁碟機>:\Program Files\Microsoft SQL Server\MSRS10_5.MSSQLSERVER\Reporting Services\ReportServer\web.config。若要設定執行一個要求的秒數上限,請在這個檔案中加入 httpRuntime 元素:

<configuration>
   . . .
   <system.web.
      . . .
      <httpRuntime executionTimeout="90"/>
      . . .
   </system.web.
   . . .
</configuration>

根據報表大小而定,這個值可能必須代表數個小時。

報表轉譯時間過長。

當報表資料與配置結合為暫時格式並傳送到轉譯延伸模組後,就會開始進行報表轉譯。轉譯時間受到資料量、報表項目執行個體數量以及分頁等因素影響。當您匯出報表時,會傳送暫時格式到指定的轉譯器。如果您知道使用者以特定格式檢視報表,則必須針對該格式的轉譯器將報表最佳化。如需詳細資訊,請參閱<匯出報表 (報表產生器 3.0 和 SSRS)>和<了解轉譯行為 (報表產生器 3.0 和 SSRS)>。

請使用本節來協助改進報表的轉譯效能。

未針對所選轉譯格式將報表最佳化

某些功能不受所有轉譯器支援。如果使用特定檔案格式做為檢視報表的主要格式,您可能必須修改報表設計,以便讓使用者獲得最佳化的檢視方式。

  • 在必要的地方加入分頁符號。例如,每一個分頁符號都會定義 Excel 中的一個新工作表。每一個工作表最多可以包含 65000 個資料列。當您在報表中設定分頁符號時,請考慮這些限制。

  • 匯出到 Excel 時,請勿在 Tablix 資料區域中合併資料格。在自由格式的報表中,垂直對齊報表項目。在匯出的報表中,合併的資料格和未對齊的報表項目會影響 Excel 功能。

  • 使用 HTML 剖析器來轉譯大型 HTML 頁面的效率並不高。如果轉譯報表時遇到問題,請選擇一種產生較小檔案的格式 (例如 CSV)。如果因為無法使用報表工具列,所以不能選擇另一種格式,此時可以定義訂閱來設定轉譯格式,並將報表當成靜態文件傳遞至檔案共用。如需詳細資訊,請參閱<Reporting Services 中的檔案共用傳遞>。

最佳化報表處理的設計秘訣

如果報表效能是您的首要考量,請使用下列資訊協助最佳化報表處理時間:

  • 對於包含許多文字方塊執行個體的報表,請將文字方塊上的 CanGrow 和 CanShrink 設為 FALSE。依預設,Tablix 資料區中的每個資料格都包含一個文字方塊,所以必須轉譯的文字方塊總數量可能會快速成長。

  • 對於包含許多影像的報表,請將影像上的 AutoSize 設為其他值,例如 Fit。

  • 對於文字方塊,請避免將 TextAlign 屬性設為 General。這個值會要求根據文字方塊內容進行條件式處理。

  • 避免使用不必要的水平分頁符號。檢閱報表中的邊界、資料行寬度和空白。例如,將報表轉譯為 .TIFF 檔案,並使用 Microsoft Windows 圖片和傳真檢視器來檢視報表,判斷是否轉譯了多餘頁面。

除非您必須控制 Tablix 資料區的特定轉譯行為,才對 Tablix 成員設定 KeepTogether 屬性。計算分頁符號時,KeepTogether 功能需要進行額外處理。

了解使用追蹤旗標的影響

SQL Server Database Engine 追蹤旗標非常實用,但是請務必了解追蹤旗標可以最佳化的方式以及追蹤旗標對於其他應用程式的影響層面。例如,在同時執行資料庫和報表伺服器的電腦上使用 T834 旗標時,建議您為 SQL Server Database Engine 和報表伺服器設定記憶體限制。如需有關 Database Engine 的詳細資訊、'max server memory' 選項的檢閱資訊以及有關報表伺服器的詳細資訊,請參閱<設定報表伺服器應用程式的可用記憶體>。

-