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

WinDev Discussion :

Quel est le parcours le plus rapide


Sujet :

WinDev

  1. #1
    Membre éprouvé

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut Quel est le parcours le plus rapide
    Bonjour,

    je traite une table assez grosse sur une base de donnée (PostgreSQL)
    un peu plus de 10 millions de lignes.

    J'ai un traitement assez simple à effectuer :
    si un champ "Report" est égal à 2 je dois
    1 lire les valeurs de la ligne
    2 créer un enregistrement dans une table "ReportTable" avec ces valeurs
    3 supprimer la ligne.

    J'ai essayé pas mal de traitements mais tous sont trop longs.
    - parcours "POUR TOUT ReportTable"
    - parcours avec requête et selectiojn d'un lot de lignes
    - parcours TANT QUE... HlitSuivant

    dans tous les cas le traitement prends des heures

    D'où ma question : Quel type de parcours préférez vous pour les gros volumes ?

    merci

  2. #2
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    février 2007
    Messages
    611
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2007
    Messages : 611
    Points : 833
    Points
    833
    Par défaut
    Bonjour
    pourquoi ne lances-tu pas des audits (ils sont fournis avec windev et te donne le temps de chaque appel) pour savoir quel est réellement le meilleur temps ?
    c'est un peu long à étudier mais globalement, cela aide bien sur des traitements redondants.
    Tu auras la réponse exacte par rapport à ta config.
    et en plus tu pourrais nous le dire

    Bon test
    Gancau

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 664
    Points : 11 171
    Points
    11 171
    Par défaut
    Bonjour,
    Le plus rapide ? Avec deux requêtes:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into table2(col1,col2) select col3,col4 from table1 where col4 = 'xx'
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete from table1 where col4 = 'xx'
    Le tout bien sûr dans une transaction...

    Ainsi aucun parcours à faire, rien ne transite sur le réseau, tout est fait sur le serveur.

    Tatayo.

  4. #4
    Membre éprouvé
    Inscrit en
    avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 1 129
    Points : 1 284
    Points
    1 284
    Par défaut
    Salut!

    Tatayo, il me semblait que les transactions ne fonctionnaient que sur les ordres H ?

    Peut-on me confirmer SVP?

    Car dans ce cas, je suis en train de me pourrir la vie

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 664
    Points : 11 171
    Points
    11 171
    Par défaut
    Citation Envoyé par zouzoukha Voir le message
    Salut!

    Tatayo, il me semblait que les transactions ne fonctionnaient que sur les ordres H ?

    Peut-on me confirmer SVP?

    Car dans ce cas, je suis en train de me pourrir la vie
    Pour ce qui est des ordres h* => aucune idée, je ne m'en sers pas. Je suppose que hTransaction ne fonctionne effectivement qu'avec des hExecuteRequete/hExecuteRequeteSql et autre hAjoute/hModifie.
    Par contre on peut utiliser des transactions avec les ordres Sql*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sqlexec("subtrans begin","reqtrans")
    sqlferme("reqtrans")
    ... mises à jour via SqlExec...
    SI bMajOK ALORS
    SqlExec("commit","reqtrans")
    SINON
    SqlExec("rollback","reqtrans")
    FIN
    SqlFerme("reqtrans")
    Tatayo.

  6. #6
    Membre éprouvé

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Après une série de nouveaux essais je confirme qu'il faut abandonner tous les ordres H***
    J'essaye aujourd'hui avece le SQLExec et SQLsuivant
    et je vous fais un retour.

  7. #7
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 894
    Points : 3 782
    Points
    3 782
    Par défaut
    Bonjour,

    Je ne sais pas à quoi te sert ton traitement ni dans quel cas tu l'utilise mais moi je partirais vers l'utilisation de triggers directement sur ta base PostgreSQL.
    Ainsi lors du passage de ton champ Report à 2 le traitement se fera directement pour ton enregistrement.
    Bien sur il faut que ton champ Report soit enregistré dans ta base de données.
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur freelance
    Inscrit en
    juillet 2002
    Messages
    2 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : juillet 2002
    Messages : 2 360
    Points : 4 718
    Points
    4 718
    Par défaut
    Bonjour

    On n'est pas obligé d’utiliser les ordres SQL..., on peut utiliser HExecuteRequeteSQL+hSansCorrection

    Mais il ne faut utiliser les instructions HTransaction.. de Windev, il faut utiliser le code SQL spécifique à la base pour gérer les transactions

  9. #9
    Membre éprouvé

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Alors voici la réponse enfin ma réponse aujourd'hui pour ce problème :
    Pour rappel je suis sous PostgreSQL mais de toutes façons en HyperFile avec plus de 4 milions de lignes=crash assuré

    - Quand le parcours se fait sur une table assez petite (quelques centaines de miliers de lignes) : Utilisez ce qui vous plait.

    - Quand le parcours se fait sur 3 ou 4 millions de lignes :
    Abandonnez HexecuteRequete
    car celà charge la totalité de la requête en mémoire.
    (mais si mais si c'est sûr pour PSQL en tout cas)

    Abandonnez les parcours de type POUR TOUT
    Et abandonnez aussi HlitPremier TANTQUE PAS Hendehors .....
    car trop long.... trop long.... trop long...

    Orientez vous vers SQLExec MAIS ATTENTION
    avec le parcours SQLAvancce/SQLLitCol
    qui permet de lire la requête ligne à ligne.

    En plus avec ce type de parcours vous pouvez informer l'utilisateur de l'avancé du traitement ce qui ralenti de moitié le processus mais qui a le mérite de garder l'ordinateur de votre client en bonne santé.

    Sinon effectivement la solution la plus performante serait de travailler directement en trigger sur la base mais ce n'est pas possible dans ce cas.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 664
    Points : 11 171
    Points
    11 171
    Par défaut
    Bonjour,
    Et avec ma méthode, c'est à dire sans aucun parcours, qu'est-ce que ça donne ?

    Tatayo.

  11. #11
    Membre éprouvé

    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Avec une superbe requête comme le suggère Tatayo
    INSERT INTO table2(col1,col2) SELECT col3,col4 FROM table1 WHERE col4 = 'xx'
    ça marche très bien sauf que :
    - Pas moyen de savoir ou en est le serveur du calcul
    - Très très très long si vous avez de très grosses tables et pas assez de mémoire.
    - Difficile à mettre en oeuvre car j'ai des traitements à faire sur certains champs avant insertion et trois tables à modifier en cascade.

    Mais en pur SQL dans un cas assez simple c'est effectivement la bonne méthode.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 664
    Points : 11 171
    Points
    11 171
    Par défaut
    En fait j'utilise ce genre de requête dans des traitements batchs que personne ne regarde tourner (donc "tant pis" si on ne vois pas de jauge d'avancement) et sur des tables qui restent modestes (quelques dizaines de milliers de ligne tout au plus).
    Mais il est clair qu'un utlisateur perd très vite patience devant une application qui semble figée.

    Tatayo.

  13. #13
    Membre éprouvé
    Inscrit en
    avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 1 129
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par Atsibat Voir le message
    Orientez vous vers SQLExec MAIS ATTENTION
    avec le parcours SQLAvancce/SQLLitCol
    qui permet de lire la requête ligne à ligne.
    Salut!

    Pour un pur dur HF comme moi est -il possible d'utiliser ces ordres SQLExec sur du HF Classic ou C/S ?

    Désolé, je n'ai jamais eu à utiliser sql

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur freelance
    Inscrit en
    juillet 2002
    Messages
    2 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : juillet 2002
    Messages : 2 360
    Points : 4 718
    Points
    4 718
    Par défaut
    Citation Envoyé par zouzoukha Voir le message
    Salut!

    Pour un pur dur HF comme moi est -il possible d'utiliser ces ordres SQLExec sur du HF Classic ou C/S ?

    Désolé, je n'ai jamais eu à utiliser sql
    Oui c'est possible, mais ça n'a aucun intérêt. Il vaut mieux utiliser les instructions qui lui sont dédiées, c'est à dire les fonctions H...
    Pour exécuter une requête SQL : HExecuteRequeteSQL

    On peut faire remplacer des boucles imbriquées par une seule requête pour un gain de performance.
    Ce qui n'empêche pas d'utiliser des HAjoute, HModifie etc ... qui sont très pratiques

    J'utilise les fonctions SQL... pour les autres bases (DB2, MySql, PotsgreSQL, SQL Server) mais je pourrais très bien utiliser les HExecuteRequeteSQL (sauf en ODBC je crois)

    Un résumé ici

  15. #15
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : octobre 2010
    Messages : 1 286
    Points : 2 558
    Points
    2 558
    Par défaut
    Bonjour,

    Pour décharger la mémoire et donc gagner en temps, il faut penser au commit toutes les X lignes. A paramétrer dans la transaction comme première instruciton ...

    à bientôt,

    Nicolas

Discussions similaires

  1. Quel est la méthode la plus rapide ?
    Par Invité dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2014, 21h20
  2. [Généralités] Quel est le moyen le plus facile et le plus rapide pour maîtriser Windev ?
    Par arthur_1569 dans le forum WinDev
    Réponses: 11
    Dernier message: 02/07/2011, 21h31
  3. [Firebird] Quel est le code le plus rapide ?
    Par ILP dans le forum Bases de données
    Réponses: 8
    Dernier message: 26/10/2009, 14h01
  4. Réponses: 2
    Dernier message: 27/01/2009, 20h01
  5. [FB1.5]Quelle est la requete la plus rapide ?
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 10/12/2004, 14h46

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