2009-11-04 74 views
5

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

感谢您的任何帮助。

+0

相关:http://stackoverflow.com/questions/42483/simulated-olap/42504#42504 – 2009-11-09 04:12:59

回答

13

苹果和桔子:分析服务OLAP多维数据集是一种与SQL Server数据库完全不同的存储类型,它们被设计用来完成不同的事情。从技术上来说,MDX并不比T-SQL“反应更快”,反之亦然 - 它们只是语言,但是针对不同的需求而设计。

话虽如此,立方体通常是最适合做数字分析静态数据,如聚合大量的销售/交易/随着时间的任何记录。相比之下,传统的关系数据库一般工作得很好,如果架构和索引构造得很好,就可以进行搜索。一个简单的方法来判断:如果你的SQL查询所要做的

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

了很多,然后一个立方体可以帮助(它是专为骨料数学函数 - 和()和GROUP BY)。 OTOH如果你的查询做了很多的

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

然后立方体可能不会帮助,我会转而专注于调整模式,查询和索引,或许表分区,如果数据可以适当划分。

您是否拥有聚簇索引并涵盖与查询匹配的非聚簇索引?

2

“的存储过程的性能即使有适合的索引这么慢”

我会感到惊讶,如果存储过程是真正的问题,也许是正在使用的程序的方式是缓慢的,但存储过程按定义不会变慢。你有没有发现你的程序很慢?有你的个人资料?在重新设计我的数据库之前,我会深入研究这条路线。多维数据库用于OLAP数据库严格来说是一个OLAP数据库,还是OLAP和OLTP的混合?也许你需要将你的OLTP设计中的数据去归一化并复制到非规范化的d结构中?表中的6亿条记录并不是很大,它不是很小,但这并不导致我相信放弃存储过程会神奇地使事情变得更快。在跳到一个更大的项目中解决问题之前,先剖析存储的特效并查看性能瓶颈的位置。

+0

一个简单的查询,如:从文章 [选择ID 其中类别名称在( 'A', 'B','C')] 与CategoryName上的索引大约需要60秒才能得到结果。 顺便说一句,数据库只包含静态数据,但它被设计为OLTP数据库。 – 2009-11-04 13:51:50

+0

什么查询计划可以给你?它返回多少行?列ID是否已编入索引? ('A','B','C')上的IN将不能使用索引。 – Kuberchaun 2009-11-04 14:10:15

+0

下面是一些链接,提供了一些可能有用的高级技巧http://blogs.techrepublic.com.com/datacenter/?p=173 – Kuberchaun 2009-11-04 14:16:49

6

MS SSAS OLAP多维数据集可以用几种存储模式下使用:

  1. 关系(OLAP) - 数据和元数据停留在你的数据库和几个物化加意见。可能会或可能不会更快。

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

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

开始在此之前,你应该考虑优化您的报告和分析表的布局,换句话说,使用数据仓库(DW) - 把你的数据在金博尔星维度和事实表。然后,定期使用ETL(SSIS)加载DW,并将报告和分析指向DW。这可能是因为你根本不需要使用SSAS - 针对星型表格布局运行的SQL查询通常比针对标准化数据库操作数据库要快得多。 如果这仍然太慢,请在DW之上构建SSAS多维数据集。 一旦你开始加载你的数据仓库,你可以从你的操作数据库中删除记录,使其日常使用速度更快。总结一下,我的经验法则是:
1.构建一个DW并设置您的ETL过程
2.尝试针对DW的T-SQL报告,它可能已经足够了。
3.如果仍然很慢,请在HOLAP模式下构建SSAS多维数据集(在DW之上)并使用MDX查询它们。