我有一个MDX查询,如下所示:

WITH
MEMBER [Measures].[Percentage of All Accounts] AS [Measures].[SUM Principal EUR]/SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR])
SELECT
    NON EMPTY
    {
        [Measures].[SUM Principal EUR],
        [Measures].[SUM Principal USD],
        [Measures].[SUM Principal Local Currency],
        [Measures].[Percentage of All Accounts]
    } ON COLUMNS,
    NON EMPTY
    { (
        [Contract].[Product Group].ALLMEMBERS,
        [Dates].[YearMonth].ALLMEMBERS
    ) } ON ROWS
FROM 
(
    SELECT
    { (
        STRTOSET(@ContractProductGroup, CONSTRAINED),
        STRTOSET(@DatesYearMonth, CONSTRAINED)
    ) } ON 0
    FROM [Assets]
)
WHERE
{
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] },
    [Assets Cont].[Contract Status].&[C1]
}

可以优化吗?

我知道您不能在您的计算机上运行它,但是我想知道此查询中是否存在某些不好的做法,或者可以做得更好。

#1楼 票数:1

您是否可以通过引入一些空值来使自定义度量更加稀疏?
也针对您的ON ROWS为什么不只是使用普通的交叉联接。
尝试使用.MEMBERS而不是.ALLMEMBERS函数。
您可以尝试在WITH子句中创建一个自定义集: [nonEmpSet]另外,我将WHERE子句中的花括号更改为元组括号,因为这是更标准的选择。

WITH 
  SET [nonEmpSet] AS 
    NonEmpty
    (
      {
        [Contract].[Product Group].MEMBERS * [Dates].[YearMonth].MEMBERS
      },
     ,[Measures].[SUM Principal EUR]
    ) 
  MEMBER [Measures].[Accounts NEW] AS 
    Aggregate
    (
      {
        [Contract].[Product Group].&[P1]
       ,[Contract].[Product Group].&[P2]
       ,[Contract].[Product Group].&[P3]
      }
     ,[Measures].[SUM Principal EUR]
    ) 
  MEMBER [Measures].[Percentage of All Accounts] AS 
    IIF
    (
      [Measures].[Accounts NEW] = 0
     ,null
     ,
      [Measures].[SUM Principal EUR] / [Measures].[Accounts NEW]
    ) 
SELECT 
  NON EMPTY 
    {
      [Measures].[SUM Principal EUR]
     ,[Measures].[SUM Principal USD]
     ,[Measures].[SUM Principal Local Currency]
     ,[Measures].[Percentage of All Accounts]
    } ON COLUMNS
 ,NON EMPTY 
    [nonEmpSet] ON ROWS
FROM 
(
  SELECT 
    {
      (
        StrToSet
        (@ContractProductGroup
         ,CONSTRAINED
        )
       ,StrToSet
        (@DatesYearMonth
         ,CONSTRAINED
        )
      )
    } ON 0
  FROM [Assets]
)
WHERE 
  (
    {
      [Contract].[Unit].&[U1]
     ,[Contract].[Unit].&[U2]
     ,[Contract].[Unit].&[U3]
    }
   ,[Assets Cont].[Contract Status].&[C1]
  );

#2楼 票数:0

如果不是问题,请按如下所示创建多维数据集级别成员:

CREATE
MEMBER [Measures].[Percentage of All Accounts] AS NULL;

SCOPE(
{
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] },
    [Assets Cont].[Contract Status].&[C1]
});

[Measures].[Percentage of All Accounts] =
Measures].[SUM Principal EUR]
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR]);

END SCOPE;

同样在查询中,使用NonEmpty()函数摆脱不必要的交叉联接。

SELECT
    NON EMPTY
    {
        [Measures].[SUM Principal EUR],
        [Measures].[SUM Principal USD],
        [Measures].[SUM Principal Local Currency],
        [Measures].[Percentage of All Accounts]
    } ON COLUMNS,
    NON EMPTY 
    NonEmpty(
        [Contract].[Product Group].ALLMEMBERS,
        [Dates].[YearMonth].ALLMEMBERS
    ) ON ROWS
FROM 
(
    SELECT
    { (
        STRTOSET(@ContractProductGroup, CONSTRAINED),
        STRTOSET(@DatesYearMonth, CONSTRAINED)
    ) } ON 0
    FROM [Assets]
)

编辑-WHERE子句而不是子选择

WITH MEMBER [Measures].[Percentage of All Accounts] AS 
[Measures].[SUM Principal EUR]
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR])

SELECT
    NON EMPTY
    {
        [Measures].[SUM Principal EUR],
        [Measures].[SUM Principal USD],
        [Measures].[SUM Principal Local Currency],
        [Measures].[Percentage of All Accounts]
    } ON COLUMNS,
    NON EMPTY
    { (
        [Contract].[Product Group].ALLMEMBERS,
        [Dates].[YearMonth].ALLMEMBERS
    ) } ON ROWS

    FROM [Assets]
WHERE
{
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] },
    [Assets Cont].[Contract Status].&[C1],
    STRTOSET(@ContractProductGroup, CONSTRAINED),
    STRTOSET(@DatesYearMonth, CONSTRAINED)
}

编辑2

WITH MEMBER [Measures].[Percentage of All Accounts] AS 
[Measures].[SUM Principal EUR]
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR])

SELECT
    NON EMPTY
    {
        [Measures].[SUM Principal EUR],
        [Measures].[SUM Principal USD],
        [Measures].[SUM Principal Local Currency],
        [Measures].[Percentage of All Accounts]
    } ON COLUMNS,
    NON EMPTY
    { (
       STRTOSET(@ContractProductGroup, CONSTRAINED),
       STRTOSET(@DatesYearMonth, CONSTRAINED)
    ) } ON ROWS

    FROM [Assets]
WHERE
{
    { [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] },
    [Assets Cont].[Contract Status].&[C1]
}

  ask by irusul translate from so

未解决问题?本站智能推荐:

1回复

MDX查询优化

我有一个在Excel中生成的数据透视表。 我需要使用与Excel中相同的MDX查询,我已经从Excel中提取了相同的查询,如下所示- 该查询在excel中返回大约3个lac记录,当我在SSMS中运行此查询时,它会显示类似“服务器:由于内存不足而取消了该操作”的错误。 我是MDX的新手,
1回复

优化MDX查询

我的查询中有两个需求,首先是:根据我的测量值对商品进行排序,应该首先出现销售额更高的商品。 第二:在我的预分类产品清单上有累计金额。 为了达到上述目标,我在MDX下方写了: 但是运行大约需要3分钟,关于如何优化我的代码的建议还是正常的? 我总共有9635个产品
1回复

需要优化MDX查询

我已经通过BIDS查询设计器建立了此查询。 但是我想通过删除最外面的FROM子句中的SELECTS并仅在from子句中使用多维数据集,并在where或filter子句中保留过滤器来优化此查询: 我是MDX的新手,对MDX查询优化的了解也不多。 因此,我也不知道这是查询的优化版本,还是仍然
1回复

优化MDX查询

我是MDX的新手,我需要有关此查询的帮助。 我在仪表板工具(Dundas仪表板)中使用上述命名集,以便检索MODE(重复最多的价格值)。 它确实显示正确的结果,但是速度很慢。 如果一周没有过滤器,则需要2-3秒;如果一周没有过滤器,则需要6-7秒(显示所有星期的数据)。 这在SSMS中
2回复

MDX:此查询优化

用于显示278条记录,耗时2分钟47秒,因此没有任何方法可以优化查询。
2回复

MDX:查询优化

要显示结果集,需要2分钟。 有什么方法可以优化查询?
2回复

MDX通过类别计数优化来衡量客户

这是我的措施: 它使我在一个时期内某个类别中有多少客户 我的事实表很喜欢 而我的尺寸: 所以对于26号,我将有: 如果有人认为有明显的改进……在2017年的一天里,我花了1min-1min30的时间对所有4类进行了处理。表事实超过1亿行。 每个客户至少有1个事实。 Cal
2回复

使用LINKMEMBER优化MDX计算量度

我有两种报告(发送报告和接收报告),以及两种角色扮演维度(发送者和接收者)。 我正在尝试按发送者/接收者比较一个组织的每个报告的金额。 我当前的查询是: 结果正确,但是执行时间很长。 特别是在实际查询中,我有15-20个小节。 有可能以任何方式优化此查询吗?