Quel est le moyen le plus efficace de calculer les totaux cumulés pour la consommation dans Sql Server Analysis Services?

StackOverflow https://stackoverflow.com/questions/445299

  •  22-07-2019
  •  | 
  •  

Question

J'ai un cube dans SSAS 2005 qui calcule les sommes en cours sur des millions d'enregistrements. L'implémentation actuelle utilise une fonction de somme PeriodsToDate dans MDX. Elle est horriblement lente et prend 15 minutes ou plus pour renvoyer les résultats dans certains cas. Il existe un grand nombre de solutions à ce problème. J'espère donc que quelqu'un d'autre en a déjà testé quelques-unes et qu'il me fera gagner du temps pour la mise en œuvre et le test de chacune d'entre elles.

Est-il préférable de calculer les sommes en cours et les calculs de type fenêtre glissante dans T-SQL à l'aide d'un curseur (aucune solution de liaison croisée de Celko, je sais qu'elles ont belle apparence sur le papier, mais les solutions de jointure sont terriblement lentes à mesure que vos données augmentent ), à l'aide d'une tâche de script dans SSIS (ou existe-t-il un meilleur moyen de le faire dans les services d'intégration) ou à l'aide de MDX dans Analysis Services?

Avez-vous d'autres idées?

Était-ce utile?

La solution

Il m'a fallu peu de temps pour comprendre où cela fonctionnerait avec et sans hiérarchie dans la dimension temporelle. En fonction de mes données et de la structure de mon cube, voici ce que j'ai assemblé:

with member [Measures].[RunningTotal] as 
'sum({[Deferred Revenue Date].[Standard Calendar].CurrentMember.Level.Item(0):[Deferred Revenue Date].[Standard Calendar].CurrentMember}, [Measures].[Deferred Revenue Amount])'
select
    {[Measures].[Deferred Revenue Amount]
    ,[Measures].[RunningTotal]
    } on columns,
    nonempty([Deferred Revenue Date].[Standard Calendar].[Date], [Measures].[Deferred Revenue Amount]) on rows
from
DW;

Une astuce est la clause nonempty () qui ne renverra des valeurs dans la colonne de mesure calculée que s'il existe des intersections avec la dimension et la mesure. Sans cette valeur, vous obtenez un nombre de valeurs NULL dans la colonne d'indicateur et un ensemble de valeurs répétées dans la colonne d'indicateur calculée. C'est en fait une requête très pratique.

Le membre calculé fonctionnera quel que soit le niveau spécifié dans l'instruction SELECT, que ce soit la date, le mois ou l'année. Dans mon cas, j'ai essayé de vous rapprocher le plus possible de ce que vous tentiez de faire. J'ai écrit une requête semblable à la vôtre pour mon cube et elle s'est déroulée en 43 secondes. Ce nouveau fichier fonctionne en environ 2 secondes et nous avons pas mal de données. Il devrait donc être beaucoup plus rapide pour vous également, en supposant que vous disposiez d'agrégations, etc.

.

Le problème avec MDX est qu’il ya 18 façons de faire quelque chose et que seulement une ou deux fonctionneront correctement.

Bonne chance.

Autres conseils

Le MDX que j'utilise actuellement est très lent, le voici.


Sum
(
PeriodsToDate([Date of Transaction].[Date].[(All)], [Date of Transaction].[Date].CurrentMember), [Measures].[Amount - Response]
)

Je pouvais voir le moyen le plus efficace d’exécuter total en utilisant l’agrégation de cubes. L'idée est d'obtenir la somme de tous les membres précédents + somme (parent.firstsibling: membre parent.prev, mesure) + somme (parent.parent.firstsibling: parent.parent.prevmember, mesure)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top