我正在以编程方式处理我的SSAS多维数据集。我并行处理维度(我自己管理对.Process()的并行调用)一旦完成,我就并行处理度量组分区(再次自己管理并行性)。
据我所知,这是我在SSMS中所做的直接复制(相同的过程类型等)我能看到的唯一区别是我正在并行处理所有维度而且ALL此后,度量组的分区并行分配。如果右键单击处理SSMS中的多个对象,则它似乎一次只能并行处理2个(从文本中推断,表明进程尚未在除2之外的所有处理窗口中启动)。但如果有的话,我希望我的代码更快,而不是慢于SSMS。
我已经用“开始”和“完成”调试消息包装了处理操作,一切都按预期进行。这是由.Process()完成的工作,似乎比SSMS慢得多。
在通常需要不到1小时处理的立方体上,需要7.5小时。 在通常需要不到3分钟处理的立方体上,需要6.5分钟。 据我所知,尺寸的处理大致相同,但测量组明显较慢。然而,后者当然要大得多,所以可能只是差异对我来说并不那么明显。
我对创意感到茫然,并感谢任何帮助!我错过了一个设置吗?是否自己管理并行性并且并行处理多个而不是2导致问题?
答案 0 :(得分:2)
如果你能提供你的代码,我很乐意看,但我的猜测是你在并行线程中调用dimension.Process(),希望它在服务器上并行处理。它没有赢。由于您正在执行单独的处理批次和单独的事务,它将因锁定而串行处理。
有什么理由不处理所有内容(而不是逐步处理最近的分区或其他内容)?让我们开始简单,看看这是否是您所需要的。你能获得数据库对象并只执行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和索引。