Bonjour à tous,
Je sollicite votre aide car je suis coincé sur une requête SQL.
Pour simplifier le problème, imaginons que j'ai une table qui contient les champs suivants :
type, sous_type, nature, date, statut
Le besoin est de connaître pour chaque triplet (type, sous_type, nature,) le nombre d'enregistrements dont la date est supérieure au 1er janvier 2019 et dont le statut est égal à 1.
Jusqu'ici c'est très simple, mais la requête doit aussi retourner les triplets qui ne répondent pas à ces deux critères.
Un petit exemple :
Si ma table contient les enregistrements suivants :
type1, sous_type1, nature1, '01/01/2019', 1
type1, sous_type1, nature1, '01/02/2020', 1
type1, sous_type1, nature1, '01/01/2019', 2
type1, sous_type1, nature1, '31/12/2018', 1
type2, sous_type1, nature1, '01/01/2019', 1
type3, sous_type1, nature1, '31/12/2018', 1
alors la requête doit retourner les enregistrements suivants :
type1, sous_type1, nature1, 2
type2, sous_type1, nature1, 1
type3, sous_type1, nature1, 0
J'ai donc construit la requête suivante, sans trop me soucier au départ des performances d'exécution :
J'ai testé en filtrant sur un seul triplet, ça fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 select distinct t1.type, t1.sous_type, t1.nature (select count(*) from table t2 where t2.type = t1.type and t2.sous_type = t1.sous_type and t2.nature = t1.nature and t2.statut = 1 and to_char(t2.date,'DD/MM/YYYY') >= '01/01/2019' ) total from table t1;
Le problème en revanche c'est que ma table contient un très grand nombre d'enregistrements et en conséquence, la requête est beaucoup trop coûteuse en terme de performances (le plan d'exécution indique que la requête est 100.000 fois plus coûteuse !).
J'ai le sentiment que la requête n'est pas optimisée et/ou mal construite, j'ai tenté de passer par une auto-jointure externe mais je n'ai pas réussi à retrouver les mêmes résultats.
Pourriez-vous me dire comment construire ma requête pour qu'elle soit le plus efficace possible ?
Ce qui est assez frustrant c'est que je peux exécuter deux requêtes qui s'exécutent très rapidement, la première liste tous les triplets et la seconde uniquement ceux qui répondent aux critères, et après je peux faire la fusion dans Excel mais je pense qu'une requête SQL bien construite pourrait faire ce travail directement
Merci d'avance pour votre aide, j'ai passé la journée dessus et vous êtes mon dernier espoir
Cordialement,
Sylvain
Partager