Excel数据透视表MDX慢?

Posted

技术标签:

【中文标题】Excel数据透视表MDX慢?【英文标题】:Slow Excel pivot table MDX? 【发布时间】:2011-09-08 20:02:38 【问题描述】:

每当与数据透视表交互时,Excel 都会非常缓慢,这让我非常难过。添加/删除字段、更改过滤器或切片器都需要几分钟的 Excel 冻结才能响应。

生成的 MDX 似乎效率极低。我可以理解他们必须动态生成 MDX 并且必须支持数据透视表的许多功能,但是慢 100 倍是荒谬的。

当他们为行或列上的字段生成 MDX 时,他们使用 DrilldownLevel(... [Property Dimension].[County])

我不确定 Excel 更复杂的方法的目的是什么,但我希望有一些选项可以取消选中,以便 Excel 不需要使用 DrilldownLevel 函数。

相反,我通常省略 Drilldownlevel 函数,只使用 [Property Dimension].[County].[County] 来访问属性。

使用 Excel 的 MDX 查询相同的结果集需要 5 分钟,而使用我的 MDX 只需不到 5 秒。

我已经验证缓慢不是 Excel 呈现/格式化结果的问题,因为我使用 Excel 使用的 MDX 并直接在 SSMS 中运行它来验证时间。我可以查看服务器上的任务管理器,并观察 CPU 在处理结果时的运转情况。

请注意,我并不是在责怪服务器,因为我可以创建运行极快并提供相同结果的 MDX 查询。

如何让 Excel 生成更高效的 MDX?我正在使用 Excel 2010。

我听说 powerpivot 可以生成更高效的 MDX,但是 Powerpivot 不能在 SSAS 之上使用,因为它不利用 SSAS 多维数据集。因此,简短地吐槽一下为什么 SSAS 之上的 Powerpivot 不起作用。如果您将数据从 SSAS 导入到 powerpivot,那么您实际上所做的就是执行一个巨大的交叉连接,将数据从 SSAS 迁移到 Powerpivot 表中。如果您尝试过此操作,您会发现它会生成字段名称/标签,例如“Property DimensionCountyCounty Name”……真的吗?然后,您只需使用本地 Powerpivot 的 OLAP 引擎处理数据,因此依赖于具有 64 位操作系统的客户端计算机才能处理合理大小的数据集。就好像你只是剪掉了 SSAS,把你所有的辛勤工作都丢在了构建一个复杂的 OLAP 数据库和所有元数据、计算、聚合等上。使用 SSAS 的一半原因是它可以汇总粒度数据在返回给客户端之前,这样客户端就不需要64位操作系统,也不需要客户端上的大量资源。我非常努力地使针对 SSAS 的 powerpivot 可用,但是在尝试了几种方法并与用户来回反复之后,它确实离可用还差得很远。不要敲 Powerpivot,因为我认为它在许多其他情况下很有用,但如果您的 SSAS 多维数据集是系统的重要组成部分(即计算、在服务器端聚合大量记录等),那么 powerpivot 似乎是错误的选择.

这是我的查询示例:

SELECT 
NON EMPTY CrossJoin(
[Department Dimension].[Name].[Name],
 [Finance Month].[Report Year].[Report Year]
 )
  ON COLUMNS , 
 CrossJoin(
   [Department Finance Line Type Dimension].[Display Order].[Display Order] , 
   [Department Finance Line Type Dimension].[Line Number].[Line Number],
   [Department Finance Line Type Dimension].[Display Name].[Display Name]
   ) 
   ON ROWS  
   FROM 
   (
   SELECT ([Department Dimension].[County].&[Seminole],[Department Dimension].[County].&[Sarasota]) ON COLUMNS  FROM [HYP Data View]
   ) 
   WHERE ([Department Finance Line Type Dimension].[Section Name].&[Part 1 - Balance Sheet],
   [Measures].[Amount]
   ) CELL PROPERTIES VALUE

下面是 Excel 生成的内容。实际上,当我试图简化它以确定罪魁祸首时,我实际上已经删除了 Excel 查询的其他几个方面。这是查询仍然运行缓慢时的样子,然后我采取的下一步是当我删除 DrilldownLevel 并将 .[All] 替换为 .[Attribute Name] 时,它开始大量运行更快。

非常非常慢的查询:

SELECT 
NON EMPTY CrossJoin(
DrilldownLevel([Department Dimension].[Name].[All]),
 DrilldownLevel([Finance Month].[Report Year].[All])
 )
 DIMENSION PROPERTIES PARENT_UNIQUE_NAME ON COLUMNS , 
 CrossJoin(
   DrilldownLevel([Department Finance Line Type Dimension].[Display Order].[All] ), 
   DrilldownLevel([Department Finance Line Type Dimension].[Line Number].[All]),
   DrilldownLevel([Department Finance Line Type Dimension].[Display Name].[All])
   ) 
   DIMENSION PROPERTIES PARENT_UNIQUE_NAME ON ROWS  
   FROM (
   SELECT ([Department Dimension].[County].&[Seminole],[Department Dimension].[County].&[Sarasota]) ON COLUMNS  FROM [Afr Data View]
   ) 
   WHERE ([Department Finance Line Type Dimension].[Section Name].&[Part 1 - Balance Sheet],
   [Measures].[Amount]
   ) CELL PROPERTIES VALUE

为什么需要 DrilldownLevel(...[All])?是否有一个选项可以让 Excel 不生成查询的那部分以便它运行得更快?

【问题讨论】:

可能是交叉连接和下钻级别,因为下钻级别功能并不慢。交叉连接相同维度的不同层次结构可能很耗时(您需要对所有组合执行自动存在)...不能解决您的问题,但可能有助于您理解 属性层次结构和层次结构都慢吗? 【参考方案1】:

不幸的是,尽管我在 SSAS MOLAP 多维数据集上使用 Excel 和数据透视表相当广泛,但我还没有在纯 Excel 中找到一种机制来更改它生成的查询。

然而,我使用了一个名为 XLCubed 的第三方工具,它在处理来自 SSAS OLAP 多维数据集的 Excel 和 MDX 查询时非常强大,我可以建议您尝试一下吗?您甚至可以将用于“网格”的 MDX 替换为上面完全自定义的 MDX。虽然我发现这通常不是必需的,但它们对数据透视表“网格”的替换似乎通常会生成更高效的 MDX。

愿 SSAS 众神与你同在。

【讨论】:

以上是关于Excel数据透视表MDX慢?的主要内容,如果未能解决你的问题,请参考以下文章

数据透视表中使用的 SSAS 中的新命名集 - MDX

Excel数据透视表制作 这6个技巧超好用

加快数据透视表过滤 VBA 代码

Excel数据透视表、切片器如何做?

Excel数据透视表怎么刷新数据源

Excel‖数据透视表的高级应用