本文综合描述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笔记之---增量方式处理多维数据集
这种方法应该算是微软产品线中最标准的方法。适用范围很广。
方式三:代码中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,请参考上一篇:
中关于如何以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方法就可以。
通过这种方法也可以间接的实现一种增量方案,不过需要数据仓库端实体设计上的一些配合,具体方案已经超出本文范围,但将在后续内容提到。