每当与数据透视表进行交互时,我都非常难以使用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多维数据集.因此,对于为什么Powerpivot在SSAS之上不起作用的短暂咆哮.如果您将数据从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
Run Code Online (Sandbox Code Playgroud)
以下是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
Run Code Online (Sandbox Code Playgroud)
为什么需要DrilldownLevel(... [All])?是否有一个选项,我可以翻转让Excel不生成查询的那一部分,以便它运行得更快?
不幸的是,尽管我在 SSAS MOLAP 多维数据集上广泛使用 Excel 和数据透视表,但我尚未在纯 Excel 中找到一种机制来更改其生成的查询。
不过,我使用了一个名为 XLCubed 的第三方工具,该工具在处理来自 SSAS OLAP 多维数据集的 Excel 和 MDX 查询时非常强大,我可以建议您根据自己的目的尝试一下吗?您甚至可以将用于“网格”的 MDX 替换为如上所述的完全自定义的 MDX。尽管我发现这通常不是必需的,但它们对数据透视表“网格”的替代似乎通常会生成更高效的 MDX。
愿 SSAS 之神与你同在。