salut

dans un programme en java, il y a construction d'une requête de façon dynamique

le plus optimisé (je crois) serait d'avoir

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
select caisse, guichet, joursemaine, semaine, tg1.annee, tg2.annee, tg1.nbEnv, tg2.nbEnv, ((tg1.nbEnv +tg2.nbEnv)/2)
from transactionGuichet tg1, transactionGuichet tg2
where tg1.caisse=tg2.caisse
and tg1.guichet=tg2.guichet
and tg1.joursemaine=tg2.joursemaine
and tg1.semaine=tg2.semaine
and tg1.annee!=tg2.annee
avec l'algo suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public void generateQuery(int nbDimension) {
        int[] tabAnneeATraite = new int[nbDimension];
 
        for (int i = 0; i < tabAnneeATraite.length; i++) {
 
            tabAnneeATraite[i] = i;
        }
 
        StringBuffer sb = new StringBuffer();
 
        sb.append("select caisse, guichet, joursemaine, semaine");
        int cpt = 1;
        for (int i = 0; i < tabAnneeATraite.length; i++) {
            sb.append(",tg" + cpt + ".annee");
            cpt++;
        }
 
        cpt = 1;
        for (int i = 0; i < tabAnneeATraite.length; i++) {
            sb.append(",tg" + cpt + ".nbEnv");
            cpt++;
        }
 
        sb.append(",");
        sb.append("((");
        //la moyenne - ((tg1.nbEnv +tg2.nbEnv)/2)
        cpt = 1;
        for (int i = 0; i < tabAnneeATraite.length; i++) {
            sb.append(" tg" + cpt + ".nbEnv ");
            if(i !=tabAnneeATraite.length -1)
                sb.append("+");
            cpt++;
        }
        sb.append(")" + "/" + tabAnneeATraite.length + ")");
 
        sb.append(" from ");
        cpt = 1;
        for (int i = 0; i < tabAnneeATraite.length; i++) {
 
            if (i != 0) {
                sb.append(",");
            }
            sb.append("transactionGuichet " + "tg" + cpt);
            cpt++;
        }
 
        sb.append(" where \n");
 
        generateWhere(tabAnneeATraite, sb, "caisse", " =");
        sb.append(" and ");
        generateWhere(tabAnneeATraite, sb, "guichet", " =");
        sb.append(" and ");
        generateWhere(tabAnneeATraite, sb, "joursemaine", " =");
        sb.append(" and ");
        generateWhere(tabAnneeATraite, sb, "caisse", " =");
        sb.append(" and ");
        generateWhere(tabAnneeATraite, sb, "semaine", " =");
        sb.append(" and ");
        generateWhere(tabAnneeATraite, sb, "annee", " !=");
 
        System.out.println(sb.toString());
    }
 
    public void generateWhere(int tabAnneeATraite[], StringBuffer sb, String nomChamp, String operateur) {
        int cpt = 1;
        int cpt2 = 1;
        boolean addToAdd = false;
        for (int i = 0; i < tabAnneeATraite.length; i++) {
            cpt2 = 1;
            for (int j = 0; j < tabAnneeATraite.length; j++) {
                if (i != j) {
 
                    if (addToAdd) {
                        sb.append("and ");
                        addToAdd = false;
                    }
                    sb.append("tg" + cpt + "." + nomChamp + operateur);
                    sb.append("tg" + cpt2 + "." + nomChamp + " \n");
                    addToAdd = true;
                }
                cpt2++;
            }
            cpt++;
        }
    }
on obtient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
select caisse, guichet, joursemaine, semaine,tg1.annee,tg2.annee,tg1.nbEnv,tg2.nbEnv,(( tg1.nbEnv + tg2.nbEnv )/2) from transactionGuichet tg1,transactionGuichet tg2 where 
tg1.caisse =tg2.caisse 
and tg2.caisse =tg1.caisse 
 and tg1.guichet =tg2.guichet 
and tg2.guichet =tg1.guichet 
 and tg1.joursemaine =tg2.joursemaine 
and tg2.joursemaine =tg1.joursemaine 
 and tg1.caisse =tg2.caisse 
and tg2.caisse =tg1.caisse 
 and tg1.semaine =tg2.semaine 
and tg2.semaine =tg1.semaine 
 and tg1.annee !=tg2.annee 
and tg2.annee !=tg1.annee
on remarque donc qu'il y a plusieurs éléments inutile

dans le premier car la requête prend 40 secondes avec hsqldb alors qu'avec la deuxième c'est 75...

ça va être encore pire si on passe avec une valeur de plus de 2 à la fonction

je cherche donc une méthode pour enlever les éléments équivalents

une idée

merci