IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Firebird Discussion :

Rapidite enregistrement


Sujet :

Firebird

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 125
    Points
    125
    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 : 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
    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
    www.usargancy.net

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 125
    Points
    125
    Par défaut
    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
    www.usargancy.net

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 125
    Points
    125
    Par défaut
    Ok je vais faire le test
    Mika
    www.usargancy.net

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 125
    Points
    125
    Par défaut
    Voila le résultat
    par le programme Environ 10 à 15 secondes

    PAr ib sql

    0.44 sec
    Mika
    www.usargancy.net

  7. #7
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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 ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 125
    Points
    125
    Par défaut
    Oui c'est ça
    Lorque j'arrive sur l'instruction EXecsql, il met ces 15 secondes
    Avant de passer à la suivante
    Mika
    www.usargancy.net

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 125
    Points
    125
    Par défaut
    ça y est je viens de trouver
    J'ai omis de mettre l'instruction Prepare avant le Execsql

    Merci pour votre aide
    Mika
    www.usargancy.net

  10. #10
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    ca doit venir des paramètres de connexion je pense..

    T'as essayé avec les composants IBx ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  2. [VB6] [Crystal] Selection enregistrement
    Par littlecow dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/01/2005, 13h08
  3. Enregistrer un RichEdit dans un .Txt
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 06/08/2002, 11h52
  4. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo