获得NonEmpty会员的有效方式

时间:2017-08-22 10:21:58

标签: ssas mdx

考虑Dimension_A和Dimension_B以及Measure_Amt 我需要前100个非空成员才能在Dimension_A和Dimension_B之间进行交叉连接以获得Measure_Amt。以下查询有效,但由于这些维度很大(从百万到2000万)

,因此需要花费大量时间
 with set a as subset(Dimension_A.levels(1),0,100)
    set x as SubSet(NONEMPTYCROSSJOIN(a,Dimension_B.levels(1)), 0, 100)
    select [Measures].[Measure_Amt] on 0 ,
    x on 1 
    from MY_CUBE 

和where子句,

with set a as subset(Dimension_A.levels(1),0,100)
set x as SubSet(NONEMPTYCROSSJOIN(a,Dimension_B.levels(1)), 0, 100)
select [Measures].[Measure_Amt] on 0 ,
x on 1 
from MY_CUBE where Dimension_C.member_C1 

获取单个Dimension的前100个成员很快,非空函数占大多数时间。 由于我只需要前100个非空成员而不是下一个子集,有没有办法编写更好的查询。

1 个答案:

答案 0 :(得分:0)

当你说“我需要前100个非空成员用于Dimension_A和Dimension_B之间用于Measure_Amt的交叉连接”时,我认为你的意思是想要前100个结果,其中Measure_Amt对于两个交叉不为空 - 连接集。

如果是这样,我相信这是另一种编写查询的方法,可以提高性能。

WITH 
    SET [X] AS [Dimension_A].LEVELS(1) * [Dimension_B].LEVELS(1)
SELECT
    [Measures].[Measure_Amt] ON 0,
    SUBSET(
        NONEMPTY(
            [X]
            , [Measures].[Measure_Amt]
        )
        , 0
        , 100
    ) ON 1
FROM 
    [MY_CUBE]
WHERE 
    [Dimension_C].[member_C1]