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

Bases de données Delphi Discussion :

[Firebird] Quel est le code le plus rapide ?


Sujet :

Bases de données Delphi

  1. #1
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 257
    Points : 574
    Points
    574
    Par défaut [Firebird] Quel est le code le plus rapide ?
    Bonjour,
    J'hésite entre deux posibilités pour faire mes enregistrements dans une base de données Firebird.
    Voilà, j'ai mon TIBQuery (PROPRIO) de chargé avec la requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Proprietaire
    Pour ajouter un enregistrement j'hésite donc entre :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROPRIO.Last();
    PROPRIO.Insert();
    PROPRIO.FieldByName('IDUSAGER').AsInteger := IDUSAGER;
    PROPRIO.FieldByName('QUALDEM').AsInteger := QUALDEM;
    PROPRIO.FieldByName('NOMDEM').AsString := NOMDEM;
    PROPRIO.FieldByName('PREDEM').AsString := PREDEM;
    PROPRIO.Post();
    Et la méthode par SQL :
    Code Pascal : 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
    var
      Requete, OldRequete: String;
     
    begin
      OldRequete := PROPRIO.SQL.Text;
      Requete := '  INSERT INTO PROPRIETAIRE'#13#10
               + '    (IDUSAGER, QUALDEM, NOMDEM, PREDEM)'#13#10
               + IntToStr(IDUSAGER) + ','#13#10
               + IntToStr(QUALDEM) + ','#13#10
               + QuotedStr(NOMDEM) + ','#13#10
               + QuotedStr(PREDEM) + ')'#13#10
      PROPRIO.Close();
      PROPRIO.SQL.Clear();
      PROPRIO.SQL.Add(Requete);
      PROPRIO.ExecSQL();
      PROPRIO.Close();
      PROPRIO.SQL.Clear();
      PROPRIO.SQL.Add(OldRequete);
      PROPRIO.ExecSQL();
    end;
    Quelle est selon vous la méthode la plus rapide, sachant que j'ai dans les 1000 enregistrements à inserer.
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 265
    Points : 36 006
    Points
    36 006
    Billets dans le blog
    54
    Par défaut
    Salut,
    je ne comprends pas bien l'objectif ?

    dans la proposition 1 , que vient faire le last ? si c'est pour se positionner en fin de fichier un APPEND à la place du insert fait l'affaire

    dans la proposition 2 , première remarque dans le SQL les sauts de lignes sont inutiles pour peu de bien faire attention aux espaces
    mais surtout , oldrequete est égale a quoi ? et a quoi sert-elle

    Quel est l'objectif réel , parce que je pense que le problème posé a été (trop) simplifié
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 257
    Points : 574
    Points
    574
    Par défaut
    C'est vrai que j'ai un peu trop simplifié mes explications .
    En fait, avant de faire mon insertion dans la table PROPRIO, je fait un Locate pour vérifier que le propriétaire n'existe pas déjà. D'où l'utilisation de OldRequete, qui enregistre la requête contenue dans le TIBQuery avant d'exécuter la requête d'insertion.
    Ça donne quelque chose commen ça :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if not PROPRIO.Locate('NOMDEM;PREDEM;ADRESSE',
      VarArrayOf([NOMDEM, PREDEM, ADRESSE]), [loCaseInsensitive]) then
    begin
      // Créer le propriétaire
      PROPRIO.Append();
      PROPRIO.FieldByName('IDUSAGER').AsInteger := IDUSAGER;
      PROPRIO.FieldByName('QUALDEM').AsInteger := QUALDEM;
      PROPRIO.FieldByName('NOMDEM').AsString := NOMDEM;
      PROPRIO.FieldByName('PREDEM').AsString := PREDEM;
      PROPRIO.FieldByName('ADRESSE').AsInteger := ADRESSE;
      PROPRIO.Post();
    end;
    Ou avec le SQL :
    Code Pascal : 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
    if not PROPRIO.Locate('NOMDEM;PREDEM;ADRESSE',
      VarArrayOf([NOMDEM, PREDEM, ADRESSE]), [loCaseInsensitive]) then
    begin
      // Créer le propriétaire
      Requete := '  INSERT INTO PROPRIETAIRE'#13#10
               + '    (IDUSAGER, QUALDEM, NOMDEM, PREDEM, ADRESSE)'#13#10
               + '  VALUES('#13#10
               + IntToStr(IDUSAGER) + ','#13#10
               + IntToStr(QUALDEM) + ','#13#10
               + QuotedStr(NOMDEM) + ','#13#10
               + QuotedStr(PREDEM) + ','#13#10
               + QuotedStr(ADRESSE) + ')';
      PROPRIO.Close();
      PROPRIO.SQL.Clear();
      PROPRIO.SQL.Add(Requete);
      PROPRIO.ExecSQL();
      PROPRIO.Close();
      PROPRIO.SQL.Clear();
      PROPRIO.SQL.Add(OldRequete);
      PROPRIO.ExecSQL();           
    end;
    J'espère que c'est un peu plus compréhensible comme ça .

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 265
    Points : 36 006
    Points
    36 006
    Billets dans le blog
    54
    Par défaut
    pourquoi faire compliqué quand on peut faire simple ?
    il suffi de créer un index sur la table proprio

    à la volée et sans contrôler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE UNIQUE INDEX PROPRIO_INDEX ON PROPRIETAIRE(NOMDEM,PREDEM,ADRESSE)
    et de gérer l'exception par un bloc try ... except end;

    de plus la méthode locate est lourde , cela veut dire que toute la table doit être chargée . je vote sans hésitation pour une méthode 2 améliorée grâce à l'index
    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
     
    begin
      // Créer le propriétaire
      Requete := '  INSERT INTO PROPRIETAIRE'
               + '    (IDUSAGER, QUALDEM, NOMDEM, PREDEM, ADRESSE)'
               + '  VALUES('
               + IntToStr(IDUSAGER) + ','
               + IntToStr(QUALDEM) + ','
               + QuotedStr(NOMDEM) + ','
               + QuotedStr(PREDEM) + ','
               + QuotedStr(ADRESSE) + ')';
      PROPRIO.SQL.Text:=Requete;
      try
        PROPRIO.ExecSQL;
     except
      // gestion du doublon 
     end;
    end;
    ou mieux encore avec des paramètres

    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
     
    const requete='INSERT INTO PROPRIETAIRE  (IDUSAGER, QUALDEM,NOMDEM, PREDEM, ADRESSE)  VALUES(:I,:Q,:N,:P,:A)';
    ......
    PROPRIO.SQL.Text:=requete; // une seule fois
    begin
       PROPRIO.ParamByName('I').asInteger:=IDUSAGER;
       PROPRIO.ParamByName('Q').asInteger:=QUALDEM;
       PROPRIO.ParamByName('N').asString:=NOMDEM;
     //  etc...
       try
         PROPRIO.ExecSQL;
      except
         // gestion doublon
      end; 
    end;
    et si comme je le pense les données viennent d'une source différente , le bon nom des paramètres (=nom de la source) et l'affectation de la propriété datasource à proprio évitera même l'utilisation des lignes parambyname
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    décembre 2003
    Messages
    1 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 877
    Points : 2 615
    Points
    2 615
    Par défaut
    je préfére cella:
    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
    const requete='INSERT INTO PROPRIETAIRE  (IDUSAGER, QUALDEM,NOMDEM, PREDEM, ADRESSE)  VALUES(:I,:Q,:N,:P,:A)';
    ......
    begin
     
    with TIBSQL.creat(nil) do
    try
       Transaction:=Datamodul.IBTRansact;
       sql.text:=requete
       ParamByName('I').asInteger:=IDUSAGER;
       ParamByName('Q').asInteger:=QUALDEM;
       ParamByName('N').asString:=NOMDEM;
     //  etc...
       try
         ExecSQL;
     
    finally
       free;
         // gestion doublon
      end; 
    end;
    autre chose, si tu veux pas que sergiMaster s'enerve à prpos des ForeinKey, utilise les vites et avant lis ce doc
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 265
    Points : 36 006
    Points
    36 006
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par edam Voir le message
    autre chose, si tu veux pas que sergioMaster s'enerve à propos des ForeignKey, utilise les vite et avant lis ce doc
    Rectificatif , ce n'est pas une Foreign Key mais un Index
    Je m'énerve pas j'explique

    @Edam attends que je me pointe a Casa (ce qui se dessine) et tu pourras voir ce que ça donne quand je m'enerve
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    décembre 2003
    Messages
    1 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 877
    Points : 2 615
    Points
    2 615
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Rectificatif , ce n'est pas une Foreign Key mais un Index
    Citation Envoyé par SergioMaster Voir le message
    Je m'énerve pas j'explique
    non, je parle de Foreign key car je crois que si il a relier ces table avec, il n'aura pas besoin d'index,, non??
    pour
    Citation Envoyé par SergioMaster Voir le message
    Je m'énerve pas j'explique
    je parle de notre descution, que tu as supprimer
    Citation Envoyé par SergioMaster Voir le message
    @Edam attends que je me pointe a Casa (ce qui se dessine) et tu pourras voir ce que ça donne quand je m'enerve
    vraiment tu viens au Maroc?, mais tu es le bien venu,

    je suis plus à casa, actuellement je suis à Fès, ma ville natal,
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  8. #8
    ILP
    ILP est déconnecté
    Membre confirmé
    Avatar de ILP
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 257
    Points : 574
    Points
    574
    Par défaut
    J'aurai bien mis des indexes et des foreign keys dans la base de données Firebird, mais ce n'est pas moi qui la créée, et le créateur ne veux pas mettre de contraintes .

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 265
    Points : 36 006
    Points
    36 006
    Billets dans le blog
    54
    Par défaut
    un index n'est pas une contrainte , plutôt une optimisation de recherche
    quant au 'créateur' de la BDD il ferais bien de lire le doc indiqué par @Edam
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

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

Discussions similaires

  1. Quel est le code dont vous êtes le plus fier ?
    Par Gordon Fowler dans le forum Actualités
    Réponses: 95
    Dernier message: 03/09/2015, 15h27
  2. Quel est la méthode la plus rapide ?
    Par Invité dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2014, 21h20
  3. Quel est le parcours le plus rapide
    Par Atsibat dans le forum WinDev
    Réponses: 14
    Dernier message: 12/02/2013, 23h03
  4. Quel est le moyen le plus approprié pour formuler un code
    Par medreg dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2010, 19h53
  5. Réponses: 2
    Dernier message: 27/01/2009, 20h01

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