BI笔记之---SSAS库Process的几种方案

 

本文综合描述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,请参考上一篇:

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方法就可以。

通过这种方法也可以间接的实现一种增量方案,不过需要数据仓库端实体设计上的一些配合,具体方案已经超出本文范围,但将在后续内容提到。

posted @ 2010-09-03 14:56  哥本哈士奇(aspnetx)  阅读(6020)  评论(2编辑  收藏  举报