問題
一般Analysis Services cube的性能問題可能由多方面的原因造成。源系統,cube設計,MDX查詢,網絡問題等因素都可能導致性能問題的產生。在這個系列文章中,我會分享一些設計和開發cube的最佳實踐和可以用來解決現存一些性能問題的小技巧。
解決方案
在開始深入性能調優細節之前,讓我們一起來看看典型微軟BI應用架構,這會幫助我們甄別和定位性能問題和瓶頸。
下面的架構圖展示了經典的微軟BI應用架構,從左到右我們可以看到不同的層次。
第一層是源系統或者數據倉庫。第二層是Analysis Services cube,它從源系統拉取數據,然後將數據存儲到cube/OLAP庫中。第三層是從cube/OLAP消費數據的報表應用。
儘管典型的微軟BI應用架構將不同的層次放在不同的物理機器上,但是並不是所有的情況都是如此。比如,三層應用都放在一臺物理機器,或者前兩層放在一臺機器,第三層單獨一臺機器等等實際場景。
SSAS性能優化三個關注點:
1.查詢性能
2.處理性能(Process)
3.合理和充分的利用硬件資源
SSAS內部架構的組件簡介:
查詢解釋器(Query Parser)
查詢解釋器的XMLA監聽器接收請求,解析請求,然後將解析過的請求傳輸給查詢處理器執行請求。
查詢處理器(Query Processor)
從查詢解釋器接收經過驗證和解析的請求後,查詢處理器生成一個執行計劃,該執行計劃指示如何從多維數據集(cube)和所使用的計算中返回請求結果。然後,查詢處理器會將計算結果緩存到公式引擎緩存(查詢處理器緩存),使具有同意權限的用戶之間能重用計算結果。
查詢處理器操作總結:
1.從存儲引擎請求子cube數據查詢
a.將請求轉換爲子cube數據請求
2.通過以下方式產生結果姐
a.子cube的批量計算
3.將計算結果存儲在公式引擎的不同域中
a.查詢域 - 緩存不會再會話的查詢中共享
b.會話域 - 緩存將在會話的查詢中共享
c.全局域 - 緩存可在具有相同安全角色的會話之間跨會話共享
存儲引擎(Storage Engine)
存儲引擎響應查詢處理器產生的子cube數據請求(用於查詢、緩存和數據檢索的數據的子集或邏輯單元)。它首先檢查所請求的子數據是否已經在存儲引擎緩存中可用,如果緩存有查詢的數據,直接返回數據集。如果沒有,那麼它將檢查聚合存儲是否有所需查詢的聚合數據,如果是,那麼它將從聚合存儲中獲取聚合數據並將其緩存到存儲引擎緩存,並將其發送到查詢處理器來響應請求。如果不能直接獲取聚合數據,它就會捕獲細節數據,計算所需的聚合,將其緩存到存儲引擎,然後發送到查詢處理器來響應請求。
存儲引擎操作總結:
1.創建屬性存儲(鍵存儲、關係存儲、位圖索引等)
2.創建層次結構存儲
3.創建聚合存儲
3.存儲引擎緩存
a.當查詢執行時,從存儲引擎緩存中加載數據
b.Cleaner線程清除存儲引擎緩存中的數據(在內存壓力下),或者處理分區
4.聚合數據
a.使用存儲的聚合值來響應請求
b.根據需要,聚合低粒度的數據,產生新的聚合值
5.事實數據
a.並行地掃描MOLAP分區和分區段
b.使用位圖索引掃描頁面以查找請求的數據
在排除故障時,您需要了解哪個組件消耗了大量時間,需要優化。比如查詢處理引擎或者存儲引擎。我們可以通過使用SQL Server Profiler捕獲某些事件,知曉各組件在沒有緩存的情況下消耗的時間,判斷哪些組件需要優化。(空緩存,瞭解更多關於緩存警告的信息,請參閱本系列的下一章節):
存儲引擎時間 = 每個子cube查詢事件的時間總和
公式引擎 = 總執行時間(Query End Event) - 存儲引擎時間(A)
如果存儲引擎的查詢子cube事件消耗了大量時間,那麼這個性能問題極有可能發生在存儲引擎上。在這種情況下,可能需要優化維度和聚合的設計,並創建分區以提高查詢性能(在本系列的下一篇文章中詳細討論了這個問題)。如果存儲引擎沒有花費太多時間,那麼查詢處理器就是性能的問題所在,在這種情況下,您需要專注於優化MDX查詢。
性能優化的三個方面:
處理性能
在處理數據過程(Process)中,SSAS將從源系統和數據倉庫中獲取最新數據,刷新Cube/ OLAP庫,生成集合數據。同時也會爲維度的屬性和自然層次分別創建屬性存儲(Store)和層次存儲。雖然處理時間並不會像查詢時間一樣,直接影響用戶體驗。但是,保證用戶報表在定義的服務水平協議(SLA)範圍內展現最新數據是很重要的。
查詢性能
優化查詢性能的方法:關注維度和度量組的設計,創建聚合和位圖索引(通過設置適當的屬性),優化MDX查詢(例如,通過單元模式和使用子空間模式來避免單元格)
SSAS實例/硬件資源優化
處理數據(Process)和查詢性能取決於如何優化資源以獲得更好的吞吐量。您可以通過指定並行處理的線程數,設置可供SSAS使用的內存、改進或使用更好的I/O(輸入/輸出)系統或者將數據和臨時文件放置在更快的磁盤上來獲取更好的性能。