2017-09-01 2 views
0

J'ai un cube SSAS avec de nombreuses mesures calculées écrites dans MDX.mesure calculée dans SSAS Cube soit très lent ou ne pas toutes les fonctionnalités

Un particulier me cause des problèmes - les totaux course.

Objet de la mesure calculée

La mesure calculée doit résumer tous les mouvements de B.O.T. jusqu'à la fin des temps, Signification quand il n'y a plus de mouvements parce que nous avons atteint le jour présent, alors la valeur devrait être répétée jusqu'à ce qu'il n'y ait plus de dates dans ma dimension temporelle. Exemple:

FY13 0.00 
FY14 10.00 
FY15 13.00 
FY16 14.00 
FY17 20.00 
FY18 20.00 
FY19 20.00 
FY20 20.00 
FY21 20.00 

également la mesure devrait fonctionner le long de toutes mes hiérarchies de date (il y a quatre). En fait, je eu à travailler comme prévu avec le code suivant:

CREATE MEMBER CURRENTCUBE.[Measures].[Actual Balance LCY] 
AS AGGREGATE(
    {NULL:[Posting Date].[Calendar Year Y-Q-M-D].CurrentMember} 
    * {NULL:[Posting Date].[Calendar Year Y-M-D].CurrentMember} 
    * {NULL:[Posting Date].[Fiscal Year Y-M-D].CurrentMember} 
    * {NULL:[Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember} 
,[Measures].[Actual LCY] 
), 
FORMAT_STRING = "#,##0.00;-#,##0.00", 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Actual'; 

Le problème:

Lorsque la mesure est ajoutée à un tableau croisé dynamique dans Excel et par exemple deux dimensions sont ajoutées sur la ligne et une hiérarchie de dates sur les colonnes, la requête devient très lente. 40-60 secondes (je sais que c'est lent, parce que nous avons un cube hérité construit dans timeXtender qui fait la même table Pivot en 5-10 secondes sur la même quantité de données)

J'ai ajouté NON_EMPTY au MDX. Alors la requête est rapide, mais il n'y a plus de valeurs après FY17 qui n'est pas un comportement prévu. Dans la solution héritée NON_EMPTY est également pas tapé, mais il est encore plus rapide.

La question:

Que faire pour obtenir à la fois le comportement prévu de la mesure et une vitesse de requête raisonnable?

+0

ne '[mesures] [LCY réelle]' nécessitent 'Aggregate '? peut-il être remplacé par' Sum'? – whytheq

+0

il peut sans doute. Je ne suis pas expert MDX –

Répondre

1

Votre bouchon de performance ici:

{NULL:[Posting Date].[Calendar Year Y-Q-M-D].CurrentMember} 
* {NULL:[Posting Date].[Calendar Year Y-M-D].CurrentMember} 
* {NULL:[Posting Date].[Fiscal Year Y-M-D].CurrentMember} 
* {NULL:[Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember} 

Cette opération croisée de jonction est tout simplement trop lourd. Il y a deux façons que j'utiliserais. Choisissez ce qui vous plaît plus:

1: Dépendre quelle hiérarchie vous choisissez vous obtenez le résultat (pas besoin de tout croix-jointure).

Aggregate(
    case 
     when not [Posting Date].[Calendar Year Y-Q-M-D].CurrentMember is [Posting Date].[Calendar Year Y-Q-M-D].DefaultMember 
     then {NULL:[Posting Date].[Calendar Year Y-Q-M-D].CurrentMember} 
     when not [Posting Date].[Calendar Year Y-M-D].CurrentMember is [Posting Date].[Calendar Year Y-M-D].DefaultMember 
     then {NULL:[Posting Date].[Calendar Year Y-M-D].CurrentMember} 
     when not [Posting Date].[Fiscal Year Y-M-D].CurrentMember is [Posting Date].[Fiscal Year Y-M-D].DefaultMember 
     then {NULL:[Posting Date].[Fiscal Year Y-M-D].CurrentMember} 
     when not [Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember is [Posting Date].[Fiscal Year Y-Q-M-D].DefaultMember 
     then {NULL:[Posting Date].[Fiscal Year Y-Q-M-D].CurrentMember} 
     else NULL 
    end, 
    [Measures].[Actual LCY] 
) 

2: Ajouter une mesure de jour maximum (il sait le dernier jour du membre actuel (hiérarchie agnostique):.

Aggregate(
    NULL:StrToMember('[Posting Date].[Day].[' + cint([Measures].[Max Day]) + ']') 
    [Measures].[Actual LCY] 
) 
+0

Merci beaucoup. il a fait tomber un temps de rafraîchissement de 4+ minutes à peu près 1-2 minutes, ce qui est plus acceptable. Je suppose que il n'y a aucun moyen de lui rapide sans utiliser non vide? –

+0

Oui, la façon rapide et solide pour les mesures de roulement est douloureuse au sein SSAS. il manque> = relation. Néanmoins, vous pouvez pré pare une table de mesures contenant la logique de roulement et l'agrégation LastChild. Vous pouvez également définir le rapport codé en dur avec {NULL: [Date de publication]. [Année civile Y-Q-M-D]. [20170101]} dans la clause Where. –

+0

Malheureusement, les personnes qui font ces rapports ont des exigences très changeantes.mais ne sont pas très tech.savvy, donc le plus dynamique, le mieux;) Création d'une table de mesure? Comme une table de faits normale? Cela semble être une bonne idée, mais je pensais que SSAS était particulièrement adapté à ce genre de calculs - n'est-ce pas un des pouvoirs d'utiliser un cube? –