Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Débuter
Débuter Forum d'entraide pour débuter avec Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/04/2003, 17h52   #1
Membre habitué
 
Inscription : mars 2002
Messages : 119
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 119
Points : 100
Points : 100
Par défaut Rapidite enregistrement

Voila j'ai ce petit code afin d'enregistrer un nouveau client.
La table CLIENT comprend a 22915 clients

Lorsuqe je fais le post, il se passe prés de 15 à 20 secondes pour l'enregistrement en local, mais sur un serveur prés de 30 secondes

Comment faire pour rendre plus rapide l'enregistrement
J'ai essayé avec un tblclient.insert et tblclient.post c'est pareil

Code :
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
WITH UDonnees.QryInsert do
          begin
           close;
           sql.clear;
           sql.ADD('INSERT INTO CLIENT (CODE_CLI,NOM_CLI,TYPE_CLIENT, ');
           sql.ADD('PROPRIETAIRE, DATE_VALIDITE, NOM_ADRESSE, ATTENTION_DE,');
           sql.ADD('POINT_FIDELITE, SOLDE_ACOMPTE, TYPE_FINITION,');
           sql.ADD('ORDINATEUR, EMAIL_CLI, TYPE_PRESENTATION,NUM_INTRA,');
           sql.ADD('TYPE_PAPIER, NB_BL_EN_COURS, NUM_TVA, SOLDE_ANNUEL,');
           sql.ADD('SOLDE_CUMULE, NB_FACTURES, NOM_HABILITE1, NOM_HABILITE2,');
           sql.ADD('NOM_HABILITE3,NOM_HABILITE4,NOM_HABILITE5, NOM_HABILITE6,');
           sql.ADD('TEL_HABILITE1,TEL_HABILITE2,TEL_HABILITE3, TEL_HABILITE4,');
           sql.ADD('TEL_HABILITE5,TEL_HABILITE6, ADR_CLI, ADR1_CLI,INTRA,');
           sql.ADD('CP_CLI, VILLE_CLI,TEL_CLI,ACCES_CLI,VENDEUR, CREE_LE)');
           sql.ADD(' values(:code,:nom,:type,:proprio,:validite,:nom_adr,');
           sql.ADD(':attention, :point, :solde, :finition, :ordi, :email,');
           sql.ADD(':presentation,:numintra, :papier, :bl, :tva, :annuel, :cumule, ');
           sql.ADD(':factures, :hab1, :hab2, :hab3, :hab4, :hab5, :hab6, ');
           sql.ADD(':tel1, :tel2, :tel3, :tel4, :tel5, :tel6, :adr, :adr1, ');
           sql.ADD(':intra, :cp, :ville, :tel, :acces, :vendeur, :cree_le)');
          end;
        end
       Else
        WITH UDonnees.QryInsert do
          begin
           close;
           sql.clear;
           sql.ADD('UPDATE CLIENT set CODE_CLI = :code,');
           sql.ADD('NOM_CLI                    = :nom, ');
           sql.ADD('TYPE_CLIENT                = :type,');
           sql.ADD('PROPRIETAIRE               = :proprio,');
           sql.ADD('DATE_VALIDITE              = :validite,');
           sql.ADD('NOM_ADRESSE                = :nom_adr,');
           sql.ADD('ATTENTION_DE               = :attention,');
           sql.ADD('POINT_FIDELITE             = :point,');
           sql.ADD('SOLDE_ACOMPTE              = :solde,');
           sql.ADD('TYPE_FINITION              = :finition,');
           sql.ADD('ORDINATEUR                 = :ordi,');
           sql.ADD('EMAIL_CLI                  = :email,');
           sql.ADD('TYPE_PRESENTATION          = :presentation,');
           sql.ADD('TYPE_PAPIER                = :papier,');
           sql.ADD('NB_BL_EN_COURS             = :bl,');
           sql.ADD('NUM_TVA                    = :tva,');
           sql.ADD('NB_FACTURES                = :factures,');
           sql.ADD('NOM_HABILITE1              = :hab1,');
           sql.ADD('NOM_HABILITE2              = :hab2,');
           sql.ADD('NOM_HABILITE3              = :hab3,');
           sql.ADD('NOM_HABILITE4              = :hab4,');
           sql.ADD('NOM_HABILITE5              = :hab5,');
           sql.ADD('NOM_HABILITE6              = :hab6,');
           sql.ADD('TEL_HABILITE1              = :tel1,');
           sql.ADD('TEL_HABILITE2              = :tel2,');
           sql.ADD('TEL_HABILITE3              = :tel3,');
           sql.ADD('TEL_HABILITE4              = :tel4,');
           sql.ADD('TEL_HABILITE5              = :tel5,');
           sql.ADD('TEL_HABILITE6              = :tel6,');
           sql.ADD('ADR_CLI                    = :adr, ');
           sql.ADD('ADR1_CLI                   = :adr1,');
           sql.ADD('CP_CLI                     = :cp,  ');
           sql.ADD('VILLE_CLI                  = :ville,');
           sql.ADD('TEL_CLI                    = :tel,');
           sql.ADD('ACCES_CLI                  = :acces,');
           sql.ADD('INTRA                      = :intra,');
           sql.ADD('NUM_INTRA                  = :numintra');
           sql.ADD('where code_cli             = :ancien');
           ParamByName('ancien').asstring := ancien_client;
          end;
         WITH UDonnees.QryInsert do
          begin
           parambyname('code').asstring :=  EdtCode_Client.text;
           parambyname('nom').asstring := EdtNom_Client.text ;
           IF EdtTypeClient.text = 'O' then
            parambyname('type').asstring    := 'P'
           else
            parambyname('type').asstring    := 'A';
           parambyname('proprio').asstring  := EdtProprietaire.text;
           parambyname('validite').asstring := EdtDateValidite.text;
           parambyname('nom_adr').asstring  := EdtNomclientAdr.text;
           parambyname('attention').asstring := EdtattentionDe.text;
           IF Trim(EdtNbPoints.text) <> '' then
            parambyname('point').AsInteger := StrToInt(EdtNbPoints.text)
           else
            ParamByName('point').AsInteger := 0;
           IF Trim(EdtSoldeACompte.text) <> '' then
            parambyname('SOLDE').asfloat  := StrToFLoat(EdtSoldeACompte.text)
           else
            parambyname('solde').asfloat :=  0;
           IF EdtFinition.text = '' then
            EdtFinition.text := 'M';
           parambyname('finition').asstring :=  EdtFinition.text;
           IF EdtOrdinateur.text = '' then
            EdtOrdinateur.text := 'N';
           parambyname('ordi').asstring := EdtOrdinateur.text;
           parambyname('email').asstring := EdtEmail.text;
           IF EdtTypepresentation.text = '' then
            EdtTypepresentation.text := 'A';
           parambyname('presentation').asstring :=EdtTypepresentation.text;
           parambyname('intra').asstring        :=EdtIntracommunautaire.text;
           parambyname('numintra').asstring     :=EdtnumIntra.text;
           IF EdtTypePapier.text = '' then
            EdtTypePapier.text := 'B';
           parambyname('papier').asstring := EdtTypePapier.text;
           parambyname('bl').asstring     := EdtNumBl.text;
           parambyname('tva').asstring    := EdtNumeroTVA.text;
           IF FrmMenuPrincipal.ajout_client = true then
            begin
             parambyname('annuel').asfloat           := 0 ;
             parambyname('cumule').asfloat           := 0 ;
            end;
           IF TRIM(EdtNbfactures.text) <> '' then
            parambyname('factures').AsInteger := StrToInt(EdtNbfactures.text)
           Else
            IF EdtTypeClient.text = 'O' then
             parambyname('FACTURES').asinteger       := 2
            else
             parambyname('FACTURES').asinteger       := 1;
           parambyname('hab1').asstring := EdtHabilite1.text;
           parambyname('hab2').asstring := EdtHabilite2.text;
           parambyname('hab3').asstring := EdtHabilite3.text;
           parambyname('hab4').asstring := EdtHabilite4.text;
           parambyname('hab5').asstring := EdtHabilite5.text;
           parambyname('hab6').asstring := EdtHabilite6.text;
           parambyname('tel1').asstring := EdtTelHabilite1.text;
           parambyname('tel2').asstring := EdtTelHabilite2.text;
           parambyname('tel3').asstring := EdtTelHabilite3.text;
           parambyname('tel4').asstring := EdtTelHabilite4.text;
           parambyname('tel5').asstring := EdtTelHabilite5.text;
           parambyname('tel6').asstring := EdtTelHabilite6.text;
           IF FrmMenuPrincipal.ajout_client = true then
            IF TRIM(LblDateEntree.caption) <> '' then
             parambyname('CREE_LE').asdate           := StrToDate(LblDateEntree.caption)
            else
             parambyname('CREE_LE').asdate           := Date;
           parambyname('adr').asstring               := EdtAdr_Client.text;
           parambyname('adr1').asstring              := EdtAdr1_Client.text;
           parambyname('cp').asstring                := EdtCode_Postal.text;
           parambyname('ville').asstring             := EdtVille_Client.text;
           parambyname('tel').asstring               := EdtTelephone.text;
           parambyname('acces').asstring             := 'F';
           IF FrmMenuPrincipal.ajout_client = True then
            parambyname('VENDEUR').asstring        := EdtCodeVendeur.text;
           ExecSQL;
           close;
          end;
mika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 09h44   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Quel est la définition de ta table ?
Copie les méta data de celle ici et précise quel sont les index, clé et trigger attachée à celle ci.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 10h09   #3
Membre habitué
 
Inscription : mars 2002
Messages : 119
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 119
Points : 100
Points : 100
Interbase 5.6
Delphi 3.0

Definition de la table
page Size 1024
Number of Db pages allocated = 96371
Sweep interval 20000

Clé primaire PRIMARY KEY (CODE_CLI))
Index créé
CREATE INDEX CODE_CLI ON CLIENT (CODE_CLI, NOM_CLI)
CREATE INDEX NOM_CLI ON CLIENT (NOM_CLI, CODE_CLI)


Il n'y a pas de triggers
mika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 10h41   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Citation:
Envoyé par mika
CREATE INDEX CODE_CLI ON CLIENT (CODE_CLI, NOM_CLI)
Ok je ne comprend pas à quoi te sert cet index.
Si tu recherche par CODE_CLI, Interbase va utiliser l'index de la clé primaire donc pas celui ci. Si tu recherche par NOM_CLI il va utiliser l'index que tu as créé : (NOM_CLI, CODE_CLI).

A mon avis l'index sur (CODE_CLI, NOM_CLI) est inutile et ralenti les mise à jours, et insertion sur la table.

Mais au point de passer à 20 ou 30 secondes...

Bon il faut que tu identifies si ce ralentissement provient d'interbase ou de ton programme :
Lance IBConsole et ISQL sur ta base.
et execute la requete d'insertion et regarde dans la partie résultat tu as un onglet statistique qui t'indiquera le temps qu'il a mis pour exécuter cet ordre, et les index utilisés etc... Si les performances sont correctes c'est ca vient de ton programme.

Revient apres ce test, on va essayer de trouver d'ou ca vient en fonction de ce résultat.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 11h11   #5
Membre habitué
 
Inscription : mars 2002
Messages : 119
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 119
Points : 100
Points : 100
Ok je vais faire le test
mika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 11h32   #6
Membre habitué
 
Inscription : mars 2002
Messages : 119
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 119
Points : 100
Points : 100
Voila le résultat
par le programme Environ 10 à 15 secondes

PAr ib sql

0.44 sec
mika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 12h33   #7
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Bon je pense qu'on peut en conclure que ca vient de ton programme...

A première vu je ne vois pas trop dans le code que tu as mis ce qui pourrait ralentir autant la requete...

Quand tu dis que ca met 15 à 30 secondes tu veux dire que le programme est bloqué pendant ce temps ?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 14h34   #8
Membre habitué
 
Inscription : mars 2002
Messages : 119
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 119
Points : 100
Points : 100
Oui c'est ça
Lorque j'arrive sur l'instruction EXecsql, il met ces 15 secondes
Avant de passer à la suivante
mika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 14h41   #9
Membre habitué
 
Inscription : mars 2002
Messages : 119
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 119
Points : 100
Points : 100
ça y est je viens de trouver
J'ai omis de mettre l'instruction Prepare avant le Execsql

Merci pour votre aide
mika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2003, 15h15   #10
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
ca doit venir des paramètres de connexion je pense..

T'as essayé avec les composants IBx ?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h11.


 
 
 
 
Partenaires

Hébergement Web