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

SQL Firebird Discussion :

lenteur d’exécution .


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut lenteur d’exécution .
    Bonjour à tous,

    je suis confronté à un problème que je n'arrive pas à résoudre. En effet, j'ai une table produit contenant 10000 article et j'ai besoin de modifier un champs de cette table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     update produit set matqte='01' where (numero='001')
    ce bout de code prend 2 minute pour terminer l’exécution. J'ai cru au départ que le problème venait de mon programme alors j'ai fait un test avec flamrobin et c'est pareil

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour, la table "produit" a des triggers associés ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    bonjour sergio,

    il ya aucun trigger associe

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    "numero" fait bien sur partie d'un index (unique ?) ? et matqte malgré son nom est bien un varchar(n) ou un char(n)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    exactement.. toute fois, j'ai testé la modification d'un autre champs integer et c'est pareil .

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Que donne les statistiques Flamerobin ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour sergio,

    Franchement j'y comprend rien, hier l’exécution était très lente mais ce matin on voulant te fournir les statistiques flamrobin comme par miracle ça va vite

    pour la commande sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update pro set matqte='01' where num='001'
    Executing...
    Done.
    131894 fetches, 34644 marks, 518 reads, 542 writes.
    0 inserts, 6378 updates, 0 deletes, 6429 index, 0 seq.
    Delta memory: 6322628 bytes.
    PRO: 6378 updates.
    6378 rows affected directly.
    Total execution time: 0.434s
    Script execution finished.


    et on exposant le premier code sql, je voulais arriver à une autre procédure qui est encore plus lente

    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
    SET TERM ^ ;
    CREATE PROCEDURE STKCOMP (
        NUM1 Varchar(10),
        CHE Varchar(300) )
    RETURNS (
        I Varchar(1) )
    AS
    declare variable pro1 varchar(20);
       declare variable qta numeric(14,5);   
       declare variable qtv numeric(14,5);      
    BEGIN
         for execute statement 'select pro, sum(qte) as qta, (select sum(qte)  from ven where ven.pro=ach.pro) as qtv from ach group by pro' ON EXTERNAL DATA SOURCE :che AS USER 'sysdba' PASSWORD 'masterkey' into :pro1,:qta,:qtv do
               begin
     
                           if (qta>qtv) then
                                begin  UPDATE PRO set matqte='OUI' where (pro=:pro1); end
                           else begin  UPDATE PRO set matqte='NON' where (pro=:pro1);end 
               end
        i='0';       
        suspend;
    END^
    SET TERM ; ^
    GRANT EXECUTE
     ON PROCEDURE STKCOMP TO  SYSDBA;
    dans cette procédure on utilise 2 bases de données différente. l’exécution est encore plus lente et je ne sais pas si il ya une amélioration à faire sur le code

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pour le point 1, déjà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update pro set matqte='01' where num='001'
    je t'avais demandé si code était unique , si c'est le cas alors
    PRO: 6378 updates.
    ceci est anormal
    a rechercher : les transactions mal terminées . Un essai à faire : un backup/restore pour revoir les statistiques


    pour le point 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select pro, sum(qte) as qta, (select sum(qte)  from ven where ven.pro=ach.pro) as qtv from ach group by pro'
    ce SQL est à revoir , mettre un Select dans un Select c'est pas vraiment un bon truc (à mon humble avis)
    de plus si un produit a des ventes mais d'achats ..... je sais c'est pas possible mais je connais les utilisateurs

    ce SQL me parait plus juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WITH AV AS ( SELECT pro,sum(qte) as QTA,CAST(0 AS INTEGER) AS QTV FROM ACH GROUP BY pro
                        UNION
                        SELECT pro,0,SUM(qte) FROM VEN GROUP BY pro)
    SELECT pro,qta,qtv FROM AV
    à partir de là on peut aussi faire des améliorations au test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT pro,IIF(qta>qtv,'OUI','NON') FROM AV INTO :pro1,:matqtevalue  // à vérifier le cas d'égalité
    le UPDATE de la boucle devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE PRO set matqte=:matqyevalue where pro=:pro1; // n.b. pas besoin de ()

    P.S. à quoi sert i ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour ,

    le probléme c'est que la table ACH et VEN se trouvent dans la base de données "SAISIE.FDB" et la table produit ce trouve dans la base de données "DOSSIER.FDB", ton code est efficace si on travail sur la même base de données ou peut être j'ai mal compris
    P.S. à quoi sert i ?
    dans delphi j'ustilise un select pour l'applle de la procedure alors il faut un resultat de sortie

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par chekkal Voir le message
    le problème c'est que la table ACH et VEN se trouvent dans la base de données "SAISIE.FDB" et la table produit ce trouve dans la base de données "DOSSIER.FDB", ton code est efficace si on travail sur la même base de données ou peut être j'ai mal compris
    j'ai bien compris que c'était sur une base "externe" mais as-tu seulement essayé d'utiliser mon code SQL dans la boucle for execute statement ?
    je ne sais pas si les CTE fonctionne sur une base externe mais c'est le moment de renvoyer l'info

    dans delphi j'ustilise un select pour l'applle de la procedure alors il faut un resultat de sortie
    une procédure SQL peut s'exécuter en Delphi sans pour uatant avoir besoin de résultat de sortie il suffit d'utiliser le bon composant
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour sergio,
    j'ai bien compris que c'était sur une base "externe" mais as-tu seulement essayé d'utiliser mon code SQL dans la boucle for execute statement ?
    je ne sais pas si les CTE fonctionne sur une base externe mais c'est le moment de renvoyer l'info
    J'ai testé ton code sur une seule base de données et ça marche à merveille.

    Par contre sur la base de données externe j'ai testé plusieurs combinaisons et ça marche pas, il signale des erreurs d’exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for execute statement "WITH AV AS ( SELECT pro,sum(qte) as QTA,CAST(0 AS INTEGER) AS QTV FROM ACH GROUP BY pro
                        UNION
                        SELECT pro,0,SUM(qte) FROM VEN GROUP BY pro)
    SELECT pro,qta,qtv FROM AV SELECT pro,IIF(qta>qtv,'OUI','NON') FROM AV " INTO :pro1,:matqtevalue do
    UPDATE PRO set matqte=:matqyevalue where pro=:pro1;
    le problème c'est comment récupérer le résultat "AV" de la base de données externe et l'utilisé dans la base de données locale

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    il te manque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON EXTERNAL DATA SOURCE :che AS USER 'sysdba' PASSWORD 'masterkey' INTO
    pour simplifier tu crées une variable STMT varchar(280) conntenant le SQL
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FOR EXECUTE STATEMENT STMT ON EXTERNAL DATA SOURCE :che AS USER 'sysdba' PASSWORD 'masterkey'  INTO :pro1,:matqtevalue do
    UPDATE PRO set matqte=:matqyevalue where pro=:pro1;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    bonjour sergio,

    j'ai appliquer le code sql de cette maniére
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         stmt='with av as (select pro, sum(qte) as qta,0 as qtv from ach group by pro union 
               select pro,o, sum(qte) from ven group by pro)
               select pro,IIF(qta>qtv,''OUI'',''NON'') from av'; 
         for execute statement STMT ON EXTERNAL DATA SOURCE :che AS USER 'sysdba' PASSWORD 'masterkey' into :pro1,:qtr do
                                UPDATE PRO set matqte=:qtr where (pro=:pro1);
    et ça marche. Par contre le temps d’exécution et toujours aussi long
    message flamrobin
    Executing...
    Done.
    152204249 fetches, 56597 marks, 1932777 reads, 25323 writes.
    0 inserts, 11208 updates, 0 deletes, 11 index, 71663208 seq.
    Delta memory: 18788 bytes.
    PRO: 11208 updates.
    0 rows affected directly.
    Total execution time: 0:02:10 (hh:mm:ss)
    Script execution finished.

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    S'il y a 11208 lignes dans la table PRO c'est le résultat escompté
    Je note que la CTE a fonctionné sur une Base 'externe'
    pour ce qui est de la lenteur il faut certainement incriminé ta base et sa structure. Comme au tout début de cette discussion un simple update mettait déjà ce temps
    j'en déduit que soit des transactions ne sont pas fermées sur la table (ta réaction de surprise sur le post #7) , soit il y a un problème d'unicité sur pro de la table pro (ma réaction post #8), soit encore il y a des problèmes d'index
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. [LG]Lenteur de parcours de fichier
    Par YéTeeh dans le forum Langage
    Réponses: 9
    Dernier message: 26/11/2003, 22h57
  2. [Débutant] Lenteur avec TComPort
    Par PhDt76 dans le forum C++Builder
    Réponses: 22
    Dernier message: 27/09/2003, 21h43
  3. lenteur d'affichage de requete dans un DBGrid
    Par nico27 dans le forum InterBase
    Réponses: 9
    Dernier message: 23/06/2003, 13h54
  4. [Sybase]probleme de lenteur
    Par MASSAKA dans le forum Sybase
    Réponses: 3
    Dernier message: 19/03/2003, 22h58
  5. Lenteur d'execution de Jbuilder 6
    Par Tsimplice dans le forum JBuilder
    Réponses: 6
    Dernier message: 18/12/2002, 14h41

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