Bonjour,

Suite à un changement de serveur de base de données (auparavant sous VAX, et migration vers SQLServer 8), une application met des temps de réponses hallucinant pour afficher des graphiques.

L'application et la migration n'ayant pas été effectué par moi même...je peux seulement dire que sous système VAX, ça tournait pas mal, genre quelque secondes pour afficher les résultats, alors que maintenant ça demande pas loin de 5 minutes !
En fait, il faut effectuer 21 calculs en fonction de valeurs d'un tableau.

Ce que j'ai effectué pour ciblé le problème :
- Mise en place d'un affichage du temps d'execution pour chaque requête ( de 5 à 15s * 21 calcul )
- Nombre de block lu très élevé.

D'après vous, que puis-je faire pour améliorer la situation :
- Faire des procédures stockées avec paramètre ?
- Améliorer la base de données au point de vue administration ? (en se penchant sur quoi ?)
- ? ? ?


Voici le code concerné :
Ce qu'il faut en retenir dans cette tartine :
la requête du genre :
1/
Select sum(C100),count(*) as nb,5 as GRP FROM DONNEES where voie='A1' and jour>20060926134946 and jour <=20060926135146 union Select sum(C100),count(*) as nb,4 as GRP FROM DONNEES where voie='A1' and jour>20060926134746 and jour <=20060926134946 union Select sum(C100),count(*) as nb,3 as GRP FROM DONNEES where voie='A1' and jour>20060926134546 and jour <=20060926134746 union Select sum(C100),count(*) as nb,2 as GRP FROM DONNEES where voie='A1' and jour>20060926134346 and jour <=20060926134546 union Select sum(C100),count(*) as nb,1 as GRP FROM DONNEES where voie='A1' and jour>20060926134146 and jour <=20060926134346
2 /
et les temps d'execution sur les 21 boucles énoncées précédemment.
3 /
Je joins une images du générateur de profils qui montre les temps d'execution, etc. et il y a des Audit Logout qui prennent beaucoup de temps, si vous avez une idée là dessus ?
Nom : pb_tps_execution.jpg
Affichages : 69
Taille : 227,4 Ko
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 
For Num_Calcul = Debut_Calcul To Fin_Calcul
 
  MySql = ""
 
  If (Num_Calcul <> Affichage_Compteur) Then
    If (Tableau_Calculs(P_Voie, Num_Calcul).Nom_Calcul = "") Then GoTo Next_Calcul
  End If
 
 
    ' Déclaration pour test sur temps d'execution
    Dim Init As Long ' Avant l'execution
    Dim Final As Long ' Après l'execution
    Dim TpsExec As String ' temps en ms d'execution
 
    Init = GetTickCount
 
  For i = 0 To 10 Step 5
    For j = 0 To 4
      SDateDebut = CStr(Convert_DateHeure(DateAdd("n", -((j + i) + 1) * Duree_Barre, Date_Enreg_Dern_Selec), DateTimePC_Vers_DateTimeRDB))
      SDateFin = CStr(Convert_DateHeure(DateAdd("n", -(j + i) * Duree_Barre, Date_Enreg_Dern_Selec), DateTimePC_Vers_DateTimeRDB))
 
      If (Num_Calcul <> Affichage_Compteur) Then
 
        If (Tableau_Calculs(P_Voie, Num_Calcul).Denominateur <> "") Then
          MySql = MySql & "Select sum(" & Tableau_Calculs(P_Voie, Num_Calcul).Nominateur & _
                  "),sum(" & Tableau_Calculs(P_Voie, Num_Calcul).Denominateur & _
                  "),count(*) as nb," & MAX_BARRE - (j + i) & " as GRP "
 
          If (Num_Calcul = Pertes_Totales) Then
              MySql = MySql & ",sum(" & tableau_cpt_entree_ligne(P_Voie) & ") as c " ' as cpt_entree_ligne "
          End If
        Else
          MySql = MySql & "Select Sum(" & Tableau_Calculs(P_Voie, Num_Calcul).Nominateur & "), " & _
                  "Count(*) as nb," & MAX_BARRE - (j + i) & " as GRP "
        End If
 
        MySql = MySql & "FROM DONNEES where voie='" & SVoie & "' and jour>" & SDateDebut & " and jour <=" & SDateFin & " union "
 
      Else
        If (Num_Compteur = 0) Then Num_Compteur = 100
        MySql = MySql & "Select sum(C" & Format(Num_Compteur, "0") & "),count(*) as nb," & _
                MAX_BARRE - (j + i) & " as GRP FROM DONNEES where voie='" & SVoie & _
                "' and jour>" & SDateDebut & " and jour <=" & SDateFin & " union "
      End If
 
    Next j
 
    MySql = Mid(MySql, 1, Len(MySql) - 6)
 
    ' Modification type de curseur pour optimisation, par DFR le 19/09/06
    'REC.Open MySql, BASE_VISUALISATION, adOpenStatic, adLockReadOnly
    REC.Open MySql, BASE_VISUALISATION, adOpenForwardOnly, adLockReadOnly
 
    While Not REC.EOF
 
      If IsNull(REC(0)) Then Nominateur = 0 Else Nominateur = REC(0)
 
      If Num_Calcul = Affichage_Compteur Then
        Resultats_Voie(REC(2), Num_Calcul).Valeur = Nominateur
        Resultats_Voie(REC(2), Num_Calcul).Nb_Enreg = REC(1)
        Resultats_Voie(REC(2), Num_Calcul).Denominateur = 1
        Resultats_Voie(REC(2), Num_Calcul).Nominateur = Nominateur
      Else
 
        If (Tableau_Calculs(P_Voie, Num_Calcul).Denominateur <> "") Then
          If IsNull(REC(1)) Then Denominateur = 0 Else Denominateur = REC(1)
 
          Resultats_Voie(REC(3), Num_Calcul).Nominateur = Nominateur
          Resultats_Voie(REC(3), Num_Calcul).Denominateur = Denominateur
          Resultats_Voie(REC(3), Num_Calcul).Nb_Enreg = REC(2)
 
          If Denominateur <> 0 Then
            If (Num_Calcul = Pertes_Totales) Then
                Resultats_Voie(REC(3), Num_Calcul).Valeur = 100 * (1 - (Nominateur / Denominateur))
            Else
                Resultats_Voie(REC(3), Num_Calcul).Valeur = 100 * Nominateur / Denominateur
            End If
          Else
            If (Num_Calcul = Pertes_Totales) Then
                If IsNull(REC(1)) Then
                    Resultats_Voie(REC(3), Num_Calcul).Valeur = 0
                Else
                    Resultats_Voie(REC(3), Num_Calcul).Valeur = 100
                End If
 
                If REC(4) = 0 Then Resultats_Voie(REC(3), Num_Calcul).Valeur = 0
 
            Else
                Resultats_Voie(REC(3), Num_Calcul).Valeur = 0
            End If
 
          End If
 
        Else
          Resultats_Voie(REC(2), Num_Calcul).Nominateur = Nominateur
          Resultats_Voie(REC(2), Num_Calcul).Nb_Enreg = REC(1)
          Resultats_Voie(REC(2), Num_Calcul).Valeur = 0
        End If
 
      End If
 
      REC.MoveNext
    Wend
    REC.Close: MySql = ""
 
  Next i
 
' Fin de 0 à 21 on fait.
 
  ' Fin de test de temps d'execution
  Final = GetTickCount
  '' Affichage pour test / optimisation, par DFR
  'MsgBox (Str(Final - Init) & " ms")

Merci bien pour votre aide,
Damien.