本文綜合描述SSAS庫的處理的幾種方案,並簡單介紹各種方案的應用情境。
環境約定:SQL Server 2008
樣本庫:Adventure Works DW
方式一:直接在項目中Process
這種方法在開發階段和測試階段是經常使用的。
這種處理方式通常是第一次的全量處理,如果SSAS庫猶更新的話會提示先部署。
可以看到在出現的Process介面中處理的層級是Database。
同時也可以直接點擊cube(或者是採礦結構)單獨處理它們:
如果是處理Cube的話也會有很多種方式:
同時維度也是可以單獨處理的:
還有,分區也是可以單獨處理的(如果存在分區的話),不過就不是在Solution介面了,而是得開啟Cube設計檢視,然後點分區:
關於處理增量的選項,在SSAS庫剛部署好的時候是沒有的,只有在處理過一次SSAS庫之後這個處理選項才會存在。
這個方法是最基本的方法,畢竟SSAS庫本身誕生於此。適用於開發與測試階段及生產和開發不是隔離,對安全要求不是很高的情況。
方式二:在SSIS包中Process
這個方法的優點是定義很方便。
在BIDS中直接建立項目,選擇商業智慧下的整合服務項目:
裡面有一個模組式專門用來處理SSAS庫。
可以看到在每一個模組中可以分別定義都處理什麼內容。
通常,都是先處理維度,然後再處理Cube的。
同樣,在這裡可以自己設計增量方案。如果定義好了增量方案的話,按照這種方案走的BI方案就成型了。最後需要做的就是,將SSIS包部署到整合服務上,然後設定好Job和Schedule。
關於如何部署和發布SSIS包,可以參考下面兩個連結:
http://msdn.microsoft.com/zh-cn/library/ms137592.aspx
http://msdn.microsoft.com/zh-cn/library/ms365338.aspx
關於Cube的增量處理方案,可以參考我的這篇文章:BI筆記之---增量方式處理Cube
這種方法應該算是微軟產品線中最標準的方法。適用範圍很廣。
方式三:代碼中Process
代碼的處理方式雖然比較複雜,但還是比較靈活的,主要還是調用AMO對象來實現。
這裡只簡單介紹如何處理Database層級的邏輯。(通過枚舉AMO下的Server對象的各子物件可以很簡單的定義每個SSAS對象的處理)
Server _server = new Server();
_server.Connect("localhost");
Database _db = _server.Databases["Adventure Works DW 2008"];
//generate xmla command.
_server.CaptureXml = true;
//process command.
_db.Process();
_server.CaptureXml = false;
//out put xmla.
foreach (string item in _server.CaptureLog)
{
Console.WriteLine(item);
}
Console.WriteLine("Processing");
//execute
XmlaResultCollection _result = _server.ExecuteCaptureLog(true,true);
Console.WriteLine("Process finished");
//out put result
foreach (XmlaResult r in _result)
{
foreach (XmlaMessage m in r.Messages)
{
Console.WriteLine(m.Description);
}
}
Console.WriteLine("Finished");
Console.ReadLine();
[2011-03-26補充]:另附Powershell版的Process
[void][reflection.assembly]::LoadFile("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.AnalysisServices.dll")
$server=New-Object Microsoft.AnalysisServices.Server
$server.Connect("localhost")
$db=$server.Databases.GetByName("Adventure Works DW 2008R2")
$server.CaptureXml=$true
$db.Process()
$server.CaptureXml=$false
write-output "Processing..."
$result = $server.ExecuteCaptureLog($true,$true)
foreach ($r in $result)
{
foreach ($m in $r.Messages)
{
write-output $m.Description
}
}
write-output "Done"
留意代碼的_server.CaptureXml部分,由於我們要處理的是Database,所以直接枚舉到Database的時候直接調用Process方法,其相關的XMLA指令就會儲存在_Server的CaptureLog屬性中。代碼的第一個foreach就是現實產生的XMLA命令的部分。
另:也可以通過ASCMD來處理Cube,關於如何操作ASCMD,請參考上一篇:
BI筆記之--- SSAS部署的幾種方式
中關於如何以ascmd.exe部署SSAS庫的描述。
通過代碼能處理的SSAS粒度很細,參看本文中中的Add Analysis Services Object可以看到能枚舉到的都有哪些對象,另外通過下列代碼,也可以把這些對象都枚舉出來:
Server _server = new Server();
_server.Connect("localhost");
foreach (Database _db in _server.Databases)
{
Console.WriteLine("Database:" + _db.Name);
foreach (Cube _cube in _db.Cubes)
{
Console.WriteLine("--Cube:" + _cube.Name);
foreach (MeasureGroup _mg in _cube.MeasureGroups)
{
Console.WriteLine("----Measure Group:" + _mg.Name);
foreach (Partition _pt in _mg.Partitions)
{
Console.WriteLine("------Partition:" + _pt.Name);
}
}
foreach (CubeDimension _dm in _cube.Dimensions)
{
Console.WriteLine("----Dimension:" + _dm.Name);
}
}
}
以下是運行結果:
可以看出一個SSAS庫基本上是這樣一個結構:
省略了採礦結構中的相應部分。
實際處理 cube的時候,就可以在枚舉的過程中,加入自己的邏輯來判斷這個SSAS對象是否需要被處理,如果需要被處理的話,調用其Process方法就可以。
通過這種方法也可以間接的實現一種增量方案,不過需要資料倉儲端實體設計上的一些配合,具體方案已經超出本文範圍,但將在後續內容提到。