2012-05-09 45 views
2

我在.NET中编写存储过程来执行一些复杂的计算,这些计算不能在纯MDX中轻松编写。我遇到的第一个问题是如何以表格形式检索一组数据以传递给我的计算。分析服务存储过程性能

到目前为止我的代码如下写入。我会想,当我们在位置** 1处检索到我们的值后,我们会让内存中的所有数据与之交互。但是,似乎在位置* * 2上,查询子多维数据集将在我们的范围内的每一天发布到存储引擎。这对性能是毁灭性的。

有什么我做错了吗?我可以调用另一种方法来一次评估该集​​合吗?

// First get the date range that we'd like to calculate over. 
// (These values are constant here for example only) 
DateTime date = new DateTime(2012, 4, 1); 
int dateFrom = KeyFromDate(date.AddDays(-360)); 
int dateTo = KeyFromDate(date); 

string dateRange = string.Format(
    "[Date].[Date].&[{0}]:[Date].[Date].&[{1}]", 
    dateFrom, 
    dateTo 
); 

Expression expression = new Expression(dateRange + "*[Measures].[My Measure]"); 
MDXValue value = expression.CalculateMdxObject(null); // ***1 

foreach (var tuple in value.ToSet().Tuples) 
{ 
    MDXValue tupleValue = MDXValue.FromTuple(tuple).ToInt32(); // ***2 
} 
+0

您如何连接到您的多维数据集以获取数据?您是否在使用ADOMD?如果是的话你使用ExecuteCellSet,ExecuteXmlReader或somethignelse? – Rick

+0

我写在Microsoft.AnalysisServices.AdomdServer命名空间[链接](http://msdn.microsoft.com/en-us/library/microsoft.analysisservices.adomdserver.expression一个Analysis Services存储过程和表达类。 calculatemdxobject%28v = sql.105%29.aspx)连接到多维数据集。 Adomd不适用于在客户端应用程序中使用。 – Brett

回答

0

运行SQL事件探查器,连接到分析服务,选项卡上的“事件选择”选中“显示所有事件”,选择“得到aggredations数据”,“获取从缓存中的数据”,“查询subsube”和“查询子多维数据集详细“。

首先阅读本文件http://www.microsoft.com/en-us/download/details.aspx?id=17303 - 见第18页 - 为了了解“查询子多维数据集详细”工作。

然后在调试模式的Visual Studio中(您正在调试您的过程)通过行** 1 并在SQL Profiler中查看在详细信息中查询的内容 - 什么度量组以及哪些属性。

然后在SQL事件探查器穿过*** 2和再次看到什么查询详细的事件。

我相信,一组属性是不同的,所以它可以使发生在** 1它使用了一些汇总,并在地方* * 2时,“值”是存在于元组 - 有没有为这组属性聚合,所以一旦它从“度量组缓存中读取”几次,就不会“从聚合中读取”。

我不能告诉更确切的原因,我没有你的立方体。尝试通过“query subcube verbose”事件来找出这个问题,并尝试使用BIDS Helper手动创建必要的聚合(使用特定的一组属性) - 这可能会有所帮助。