Bonjour à tous.
Je me pose une question : est-ce qu'il est possible de voir le plan d'exécution d'une Vue Matéralisée ? En effet je créé actuellement une série de VM dans le but de faire de la ré-écriture de requêtes sur une grosse table d'un datawarehouse.
J'ai un empilement de VM de la plus détaillée à la moins détaillée.Par exemple ma table de base a 1 indicateur et 300 dimensions :
TABLE_DETAIL
KPI | DIM 1... DIM 300
Ma 1ere vue matérialisée n'a plus que 2 dimensions parmis les 300 et l'indicateur est donc aggrégé (somme) :
VM1
KPI | DIM 1 | DIM 2
Ma 2e vue matérialisée n'a plus que 1 dimension parmis les 2 et l'indicateur est donc aggrégé (somme) :
VM2
KPI | DIM 1
Ma 3e vue matérialisée n'a plus aucune dimension et l'indicateur est donc aggrégé (somme) au plus haut niveau (la VM contient 1 seule ligne) :
VM3
KPI
En utilisant la ré-écriture de requêtes, Oracle sait aller chercher les données dans mes VM plutôt que dans la table de détail. Par exemple :
select DIM1, sum(KPI) FROM TABLE_DETAIL GROUP BY DIM1
va être ré-écrite
select DIM1, sum(KPI) FROM VM1 GROUP BY DIM1
ce qui va diminuer drastiquement le temps de la requête et les ressources consommées.
Cependant la question que je me pose c'est : est-ce qu'Oracle pense à se baser sur VM1 lorsqu'il créé VM2 ? Et sur VM2 lorsqu'il créé VM3 ? D'après mes tests non, donc c'est aussi coûteux pour moi de construire chaque VM alors que seule VM1 devrait me coûter du temps.
Exemple :
create VM1 as select DIM1, DIM2, sum(KPI) FROM TABLE_DETAIL GROUP BY DIM1, DIM2
-> 1mn
select DIM1, sum(KPI) FROM TABLE_DETAIL GROUP BY DIM1
-> 0.05s
create VM2 as select DIM1, sum(KPI) FROM TABLE_DETAIL GROUP BY DIM1
-> 45s
select sum(KPI) FROM TABLE_DETAIL GROUP BY DIM1
-> 0.01s
create VM3 as select sum(KPI) FROM TABLE_DETAIL GROUP BY DIM1
-> 25s
Alors que si je force Oracle à exploiter les VM crées au niveau n-1 pour calculer le niveau n:
create VM1 as select DIM1, DIM2, sum(KPI) FROM TABLE_DETAIL GROUP BY DIM1, DIM2
-> 1mn
create VM2 as select DIM1, sum(KPI) FROM VM1 GROUP BY DIM1
-> 0.5s
create VM3 as select sum(KPI) FROM VM2 GROUP BY DIM1
-> 0.1s
On voir donc bien qu'Oracle n'utilise pas la ré-écriture de requêtes pour créer les VM. De plus comme je n'arrive pas à afficher le plan d'exécution utilisé pour lé création de VM, je ne peux pas en être sûr. D'ailleurs il semble qu'il soit impossible d'obtenir un plan d'exécution pour tous les ordres CREATE, que ce soit un create VM ou un create table. Est-ce normal ?
En gros 2 questions :
- comment afficher le plan d'exécution utilisé par Oracle dans un Create Table ou un Create VM ?
- comment forcer Oracle à recalculer les VM à partir des autres VM ?
Pour la dernière question, je me dis que c'est peut-être impossible car si VM2 est calculée à partir de VM1 qui elle même a été calculée à partir de table_detail, Oracle sera incapable de comprendre que VM2 est aussi valable que VM1 pour ré-écrire des requêtes portant sur table_detail.
Merci
Partager