MDX 性能与 T-SQL

Posted

技术标签:

【中文标题】MDX 性能与 T-SQL【英文标题】:MDX performance vs. T-SQL 【发布时间】:2009-11-04 09:58:10 【问题描述】:

我有一个数据库,其中包含超过 6 亿条记录的表和一组对数据库进行复杂搜索操作的存储过程。 即使在表上有合适的索引,存储过程的性能也很慢。 数据库的设计是正常的关系数据库设计。 我想将数据库设计更改为多维并使用 MDX 查询而不是传统的 T-SQL 查询,但问题是: MDX 查询在性能方面是否优于传统的 T-SQL 查询? 如果是,这将在多大程度上提高查询的性能?

感谢您的帮助。

【问题讨论】:

相关:***.com/questions/42483/simulated-olap/42504#42504 【参考方案1】:

苹果和橘子:分析服务 OLAP 多维数据集是一种与 SQL Server 数据库根本不同的存储类型,它们的设计目的是做不同的事情。从技术上讲,MDX 并不比 T-SQL“更快”,反之亦然——它们只是语言,但针对不同的需求而设计。

话虽如此,多维数据集通常最适合对静态数据进行数字分析,例如随着时间的推移聚合大量销售/交易/任何记录。相比之下,如果架构和索引构建良好,传统的关系数据库通常可以正常工作,以进行搜索。一个简单的判断方法:如果你的SQL查询要做很多

select grock, sum/min/max/avg( foo ) 
from bar 
group by grock -- Ideal Analysis Services problem

然后一个多维数据集可能会有所帮助(它是为聚合数学函数而设计的 - sum() 和 group by)。 OTOH,如果您的查询很多

select cols 
from foo 
where <complicated search> -- Not so much

那么多维数据集可能无济于事,我会转而专注于调整架构、查询和索引,如果数据可以适当分区,也许还可以进行表分区。

您是否有一个聚集索引并覆盖与查询匹配的非聚集索引?

【讨论】:

【参考方案2】:

MS SSAS OLAP 多维数据集可用于多种存储模式:

    关系型 (OLAP) - 数据和元数据保留在您的数据库中,并添加了一些物化视图。可能会更快,也可能不会。

    混合 (HOLAP) - 元数据和(预先计算的)聚合存储在运行 SSAS 实例的新服务器上。这应该会加快所有使用聚合的查询,例如“按月计算去年员工总小时数”,但钻取到特定记录的查询可能与以前一样。

    多维 OLAP (MOLAP),您的所有数据以及元数据和聚合都将复制到 SSAS 服务器。这通常是最快的,但会重复存储。

在开始之前,您应该考虑优化报表和分析的表格布局,换句话说,使用数据仓库 (DW) - 将您的数据放入 Kimball 星形维度和事实表中。然后,您定期使用 ETL(SSIS) 加载 DW,并将您的报告和分析指向 DW。您可能根本不需要使用 SSAS —— 针对星型表布局运行的 SQL 查询通常比针对规范化 DB 的操作数据库快得多。 如果这仍然太慢,请在 DW 之上构建 SSAS 多维数据集。 开始加载 DW 后,您可能能够从操作数据库中删除记录,从而使其更快地满足日常使用。总而言之,我的经验法则是: 1。构建 DW 并设置您的 ETL 流程 2。尝试针对 DW 的 T-SQL 报告,它可能就足够了。 3。如果仍然很慢,请在 HOLAP 模式下构建 SSAS 多维数据集(在 DW 之上)并使用 MDX 来查询它们。

【讨论】:

嗨,你为什么推荐 HOLAP 而不是 MOLAP?【参考方案3】:

“即使有合适的索引,存储过程的性能也很慢”

如果存储过程是真正的问题,我会感到惊讶,也许这些过程的使用方式很慢,但根据定义,存储过程不会让它变慢。你有没有发现你的程序很慢?你有他们的简介吗?在重新设计我的数据库之前,我会仔细研究这条路线。多维数据库用于 OLAP 您的数据库是严格意义上的 OLAP 数据库还是 OLAP 和 OLTP 的混合体?也许您需要将 OLTP 设计中的数据去规范化并将其复制到去规范化的结构中?一张表中的 6 亿条记录绝不是巨大的,也不小,但这并不让我相信删除存储过程会神奇地让事情变得更快。在进入更大的项目以解决问题之前,分析您的存储过程并查看性能瓶颈在哪里。

【讨论】:

一个简单的查询,例如:[select id from article where CategoryName in ('A','B','C')] 对 CategoryName 的索引大约需要 60 秒才能得到结果。顺便说一下,数据库只包含静态数据,但它被设计为 OLTP 数据库。 这给了你什么查询计划?它返回多少行?列 id 是否被索引? ('A','B','C') 上的 IN 将无法使用索引。 这是一个链接,其中包含一些可能有用的高级提示blogs.techrepublic.com.com/datacenter/?p=173【参考方案4】:

您是否考虑过 PowerPivot(Excel 插件)?它使用垂直压缩在本地压缩约 95% 的数据,因此您可以尽情分析。

http://technet.microsoft.com/en-us/library/ee210692.aspx

【讨论】:

以上是关于MDX 性能与 T-SQL的主要内容,如果未能解决你的问题,请参考以下文章

MDX 子选择与性能问题

MDX - 过滤的 CROSSJOIN 计数 - 性能问题

如何使用 MDX 获得类似 T-SQL 的单轴叶级结果

如何纠正 T-SQL 视图中的性能不佳

嵌套 CASE 的 T-SQL 替代方案以获得更好的性能?

优化我的 T-SQL 查询以提高性能