OLAP的优点之一:查询速度比OLTP快
但是,当超过3个维度关联查询时候,速度超慢
例子:销售单(20万条)
维度:销售时间(2 * 365,其中能与销售事实关联的有150)、产品(40000条)、客户(20000条)、业务员(100)、部门
(20,包括所有部门)
SELECT [MEASURES].[SALEAMOUNT] ON 0,
TIME.DAY * PRODUCT.allmembers * CUSTOMER.allmembers * EMPLOYEE.allmembers * DEPARTMENT.allmenbers ON 1
FROM [DW] WHERE {TIME.TIME.&[2009].&[5]:TIME.TIME.&[2009].&[6]}
需要几分钟才能出数据
很是疑惑,请问下有什么办法可以提高查询速度?
------解决方案--------------------
又是晚上两点多了……
因为笛卡尔积后的成员集太大,内存中镜像的实例过多(大部分成员的值为空,稀疏),导致查询变慢。
1.查询出的空数据是否有用?没用的话(一般没用),用NonEmpty过滤掉(有必要)。
2.将维度直接从事实表中纳入多维数据集(不太好)。
3.如果确实数据量还是很大,我的处理方式是采用subset进行分次查询,这种方式不会有速度的提高,只是在工具上能达到快速响应。
还有就是等待楼下的高见了……
------解决方案--------------------
我不太主张这样的写法:
SELECT [MEASURES].[SALEAMOUNT] ON 0,
TIME.DAY * PRODUCT.allmembers * CUSTOMER.allmembers * EMPLOYEE.allmembers * DEPARTMENT.allmenbers ON 1
FROM [DW] WHERE {TIME.TIME.&[2009].&[5]:TIME.TIME.&[2009].&[6]}
CrossJoin 本来及是一个非常消耗性能的Function ,而且这样出来的数据量太大,其结果也不一定是你想要的,我想OLAP最大的优势在聚合,按照什么聚合呢?典型的是按照属性聚合,按照属性层次结构聚合,而在你的MDX中,这些优势都没有体现出来,完全是一个SQL的MDX化,
Time ,应该有年、季、月、日层次
Product :产品大类、产品小类、产品名称。
Customer :也应该有客户地区。
Department、Employee 也就应该在一个层次结构中,
如果按照层次结构,一层一层地Drill Down 或者 Drill up ,性能应该快很多,用户的体验也会好很多吧。
个人意见,仅供参考。