Bonjour à tous,
Une petite description de mes tables/vues avant d'exposer mon problème :
Une table principale, avec exactement 17 colonnes :
Avec des index, entre autres, sur les trois derniers champs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Table annuel_ann ====================== ann_annee int(11) PK ann_code char(10) PK ... ann_imp int(11) ann_niveau char(1) ann_type int(11)
Il y a également 2 vues permettant des accès différents aux données. La première permettant un accès total alors que la seconde limite l'accès à certaines données :
Il faut également savoir que vue_imp_zone1 ne sélectionne qu'une colonne qui sont des identifiants. Ce qui fait que vue_annuel_ann_part possède, ici, une colonne de plus que vue_annuel_ann_total. Dans ma base de données, je ne sélectionne en fait que les 17 colonnes de la table annuel_ann mais pour simplifier, j'ai mis "*" à la place des champs sélectionnés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE OR REPLACE VIEW vue_annuel_ann_total AS SELECT * FROM annuel_ann; CREATE OR REPLACE VIEW vue_annuel_ann_part AS SELECT * FROM annuel_ann, vue_imp_zone1 WHERE ann_imp = imp_id;
Il y a +/- 800.000 enregistrements pour vue_annuel_ann_total et 120.000 pour vue_annuel_ann_part.
Jusque là, pas de souci :
J'ai ensuite voulu commencer à effectuer des count() sur les vues en groupant par différentes colonnes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SELECT count(*) FROM vue_annuel_ann_total; => 0.214 sec SELECT count(*) FROM vue_annuel_ann_part; => 0.110 sec SELECT * FROM vue_annuel_ann_total LIMIT 0, 1000; => 0.007 sec SELECT * FROM vue_annuel_ann_part LIMIT 0, 1000; => 0.013 sec
Et voici donc mon problème. Alors que le GROUP BY marche sans problème pour la vue vue_cmpt_annuel_ann_cf, le même pour vue_annuel_ann_part est EXTREMEMENT lent alors qu'il y a moins de données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SELECT ann_annee, count(*) FROM vue_cmpt_annuel_ann_cf GROUP BY ann_annee; => 0.280 sec SELECT ann_annee, count(*) FROM vue_annuel_ann_part GROUP BY ann_annee; => 0.089 sec SELECT ann_niveau, count(*) FROM vue_cmpt_annuel_ann_cf GROUP BY ann_niveau; => 0.356 sec SELECT ann_niveau, count(*) FROM vue_annuel_ann_part GROUP BY ann_niveau; => 89.086 sec !!!!!!!
Je me suis dit que cela devait venir du fait que la vue est créée à partir de plusieurs tables/vues et j'ai recréé une vue comme ceci :
Cela fait bien diminuer le temps de la requête avec le GROUP BY (mais cela reste tout de même assez élevé) mais fait augmenter le temps d'un simple count.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE OR REPLACE VIEW vue_annuel_ann_part2 AS SELECT * FROM cmpt_annuel_ann2 WHERE ann_imp IN (SELECT imp_fase FROM vue_imp_zone1) ; SELECT count(*) FROM vue_annuel_ann_part2 => 4.446 sec SELECT ann_niveau, count(*) FROM vue_annuel_ann_part2 GROUP BY ann_niveau => 18.045 sec
Je ne comprends absolument pas d'où cela peut venir...
Si vous avez une idée ou une piste de solution, cela m'aiderait grandement !
Merci d'avance.
Partager