2

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

到目前为止,我的代码写在下面。我会认为,在我们在位置 ** 1 检索我们的值之后,我们将拥有内存中的所有数据进行交互。但是,似乎在 * *2 位置,我们范围内的每一天都会向存储引擎发出一个 Query Subcube。这对性能是毁灭性的。

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

// 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
}
4

1 回答 1

0

运行 SQL Profiler,连接到分析服务,在“事件选择”选项卡上选中“显示所有事件”并选择“从聚合中获取数据”、“从缓存中获取数据”、“查询子程序”和“查询子立方体详细信息”。

首先阅读此文档http://www.microsoft.com/en-us/download/details.aspx?id=17303 - 请参阅第 18 页 - 以了解“查询子立方体详细信息”是如何工作的。

然后在调试模式下的 Visual Studio(您正在调试您的过程)中,通过第 **1 行并在 SQL Profiler 中查看详细查询的内容 - 什么度量值组和什么属性。

然后通过 ***2 并在 SQL Profiler 中再次查看详细事件中查询的内容。

我相信这组属性是不同的,所以它可能会发生在 ** 1 中它使用一些聚合,并且当元组中存在“值”时 * *2 到位- 这组属性没有聚合,因此不是“从聚合中读取”一次,而是多次“从度量组缓存中读取”。

我不能说得更准确,因为我没有你的立方体。尝试通过“查询子多维数据集详细”事件找出这一点,并尝试使用 BIDS Helper 手动创建必要的聚合(具有特定的属性集) - 它可能会有所帮助。

于 2013-05-23T11:35:10.653 回答