我有一个数据库,其中包含超过 6 亿条记录的表和一组对数据库进行复杂搜索操作的存储过程。即使在表上有合适的索引,存储过程的性能也很慢。数据库的设计是正常的关系数据库设计。我想将数据库设计更改为多维并使用 MDX 查询而不是传统的 T-SQL 查询,但问题是: MDX 查询在性能方面是否优于传统的 T-SQL 查询?如果是,这将在多大程度上提高查询的性能?
谢谢你的帮助。
我有一个数据库,其中包含超过 6 亿条记录的表和一组对数据库进行复杂搜索操作的存储过程。即使在表上有合适的索引,存储过程的性能也很慢。数据库的设计是正常的关系数据库设计。我想将数据库设计更改为多维并使用 MDX 查询而不是传统的 T-SQL 查询,但问题是: MDX 查询在性能方面是否优于传统的 T-SQL 查询?如果是,这将在多大程度上提高查询的性能?
谢谢你的帮助。
苹果和橘子:分析服务 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
那么多维数据集可能无济于事,而我将专注于调整架构、查询和索引,如果数据可以适当地分区,也许还有表分区。
您是否有聚集索引并覆盖与查询匹配的非聚集索引?
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 查询它们。
“即使有合适的索引,存储过程的性能也很慢”
如果存储过程是真正的问题,我会感到惊讶,也许这些过程的使用方式很慢,但根据定义,存储过程并不会让它变慢。你有没有发现你的程序很慢?你有他们的简介吗?在重新设计我的数据库之前,我会深入研究这条路线。多维数据库用于 OLAP 您的数据库是严格意义上的 OLAP 数据库还是 OLAP 和 OLTP 的混合体?也许您需要将 OLTP 设计中的数据去规范化并将其复制到去规范化的结构中?一张表中的 6 亿条记录绝不是巨大的,也不小,但这并不让我相信删除存储过程会神奇地让事情变得更快。
您是否考虑过 PowerPivot(Excel 插件)?它使用垂直压缩在本地压缩约 95% 的数据,因此您可以尽情分析。