J'ai une application qui recueille des métriques de performance et les stocke dans un datamart. J'utilise ensuite Mondrian pour permettre l'analyse et l'exploration ad-hoc des données. Je collectionne environ 5e6 lignes par jour et la taille totale de la table METRIC est d'environ 300M lignes. Nous "colorons" nos données en fonction de la comparaison des métriques avec un accord de niveau de service (SLA). Il y a exactement 5 valeurs distinctes pour la couleur. Lorsque nous faisons des requêtes MDX simples pour obtenir, par exemple, une distribution de couleur des données pour une plage de dates, disons 1 jour, nous voyons des requêtes comme ci-dessous:Mauvaises performances de Mondrian avec dimensions dégénérées
2014-06-11 23: 17: 08042 DEBUG [sql] - 223: SqlTupleReader.readTuples [[Color]. [Color]]: exécution de sql [sélectionnez "METRIC". "COLOR" comme "c0" de "METRIC" "METRIC" groupe par "METRIC". "COLOR" commande par "" "MÉTRIQUES COULEUR" ASC NULLS DERNIERS] 11/06/2014 23: 17: 58747 DEBUG [sql] - 223:., exec 50704 ms
afin d'améliorer les performances , le datamart comprend des tables agrégées au Les niveaux heure et jour et les deux tableaux agrégés incluent la colonne COULEUR. Je comprends que Mondrian est très dépendante des performances de la base de données sous-jacente, mais il n'y a vraiment aucun moyen de régler cela. Je peux créer un index sur COLOR (car une analyse complète de l'index sera légèrement plus rapide qu'une analyse complète de la table), mais il semble stupide de créer un index avec 5 valeurs distinctes sur une table de 300M. La table d'agrégation de jour a environ 500K lignes et serait beaucoup plus rapide d'exécuter pratiquement la même requête sur cette table, mais Mondrian semble toujours aller à la table de faits de base pour ces requêtes de dimension.
Ma question est, est-il un moyen d'éviter cette requête? Si je ne peux pas l'éviter, est-il possible d'obtenir que Mondrian utilise les tables agrégées pour ce type de requête? J'ai spécifié approxRowCount dans le seul niveau de cette dimension/hiérarchie et cela a éliminé la requête similaire pour obtenir le nombre de valeurs. Je n'ai pas encore creusé dans la source de Mondrian pour déterminer s'il y a une possibilité d'utiliser la table agrégée ou s'il y a une configuration de ma part qui l'empêche.
Modifier clarification:
Je probablement n'a pas fait un bon travail de poser ma question, permettez-moi essayer de clarifier. Ma requête MDX ressemble à:
select [Color].[Color].Members on columns,
{[Measures].[Metric Value], [Measures].[Count]} on rows
from [Metric]
where [Time].[2014].[June].[11]
Je peux regarder cela et écrire à la main une requête SQL qui répond à cette requête
select COLOR, avg(VALUE), sum(FACT_COUNT)
from AGG_DAY_METRIC
where YEAR = 2014
and MONTH = 6
and DAY_OF_MONTH = 11
group by COLOR
Les réponses de la base de données de cette requête dans environ 100ms balayage environ 4K lignes. Il faut plusieurs minutes à Mondrian pour répondre à la requête car plusieurs requêtes ne répondent pas directement à la requête MDX, mais obtiennent plutôt des informations sur la dimension . Dans le cas ci-dessus, la base de données doit balayer 300M lignes, en prenant 50 secondes, pour retourner qu'il y a 5 couleurs possibles . Si la couleur était dans une table de dimension normale, il n'y aurait que 5 lignes, mais dans une dimension dégénérée, il pourrait y avoir 100s de millions de lignes.
Mes questions sont les suivantes:
a) Est-il possible de dire Mondrian les valeurs d'une dimension dégénérée et éviter ces requêtes?B) Existe-t-il un moyen pour Mondrian de répondre à ces requêtes à partir de tables agrégées?
Merci pour votre réponse.Il existe un nombre de mesures (type d'agrégation 'count') et toutes les tables agrégées ont une colonne FACT_COUNT et toutes les tables agrégées incluent la valeur de dimension dégénérée COLOR. J'ai aussi essayé de clarifier ma question. – sceaj