通过c#处理SSAS (Microsoft.AnalysisServices)比SSMS慢得多
本文关键字:SSMS AnalysisServices 处理 SSAS Microsoft 通过 | 更新日期: 2023-09-27 18:06:45
我正在以编程方式处理我的SSAS Cube。我并行地处理维度(我自己管理对. process()的并行调用),一旦它们全部完成,我就并行地处理度量组分区(同样我自己管理并行性)。
据我所知,这是我在SSMS中所做的事情的直接复制(相同的进程类型等)。我能看到的唯一区别是,我并行处理所有维度,之后并行处理所有度量组分区。如果你在SSMS中右键单击处理几个对象,它似乎在任何时候都只并行处理2(从文本中推断,表明进程在除2之外的所有处理窗口中都没有启动)。但如果有的话,我希望我的代码更快,而不是比SSMS慢。
我已经用"开始"answers"完成"调试消息包装了处理操作,一切都如预期的那样。. process()所做的工作似乎比SSMS慢得多。
在通常需要不到1小时处理的Cube上,它需要7.5小时。处理一个通常需要不到3分钟的立方体,需要6.5分钟。据我所知,维度的处理是一样的,但测量组明显慢了很多。然而,后者当然要大得多,所以可能只是区别对我来说不那么明显。
我不知道该怎么做,希望你能帮助我!我是不是错过了一个场景?我自己管理并行性和并行处理多个而不是两个会导致问题吗?
如果你能提供你的代码,我很高兴看到,但我的猜测是,你正在调用维度。进程()在并行线程期望它在服务器上并行处理。它不会。由于锁定,它将以串行方式处理,因为您正在执行单独的处理批和单独的事务。
有什么理由不处理所有内容(而不是增量处理最近的分区或其他内容)?让我们从简单的开始,看看这是否就是你所需要的。你能得到数据库对象,只是做一个ProcessFull吗?这将正确地并行处理所有维度和度量组。
database.Process(ProcessType.ProcessFull)
如果你确实需要增量处理,那么查看这个链接,使用ExecuteCaptureLog(true,true)在一个事务中并行运行多个ProcessUpdate命令:https://jesseorosz.wordpress.com/2006/11/20/how-to-process-dimensions-in-parallel-using-amo/
我建议在事务批处理中包含您想要处理的分区。它会自动知道正确的依赖项。还要确保在该批处理中的多维数据集对象上包含ProcessIndexes,以便在ProcessUpdate维度之后重建旧分区上的灵活aggs和索引。