Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 64
    Points : 2
    Points
    2

    Par défaut Requete lente QT C++ et sql

    Bonjour,

    J'ai une appli qui fonctionne très bien en local avec BDD QSQLITE.
    Par contre quand je met l’application en ligne avec une base SQL innoDB, ça rame beaucoup plus.

    Je ne sait pas si cela viens d'un paramaètre sur mon serveur (serveur dédié chez netissime) qui fonctionne très bien.

    Pour exprimer la lenteur, par exemple si on met un qdebug des requêtes, on peux presque les lires pendant quelles défilent dans la console...donc c'est pas horrible mais pas top quand même.
    Cela ne vient pas de la connexion internet, j'ai essayé de plusieurs poste différent.

    Je ne sais pas trop quel bout de code vous donner :
    Voici par exemple une vue :
    Code :
    1
    2
    3
    requete_sql("DROP VIEW IF EXISTS liste_client");
             //=>>>>>>>>>>>>>>>>>
             requete_sql("CREATE VIEW liste_client AS SELECT civ, nom, prenom, denomination, tel, fax, mobil,  mail, num_adresse, complement_adresse, adresse,cp , ville, ape, siret, siren_lieu, capital, activite, coordonnee_id, entreprise_id, type_entreprise_id,actif ,derniere_modif , client.id as id, (SELECT count(*) FROM inscription WHERE client_id = client.id AND etat = 0) as nbr_inscription FROM coordonnee, entreprise, client WHERE entreprise_id = entreprise.id AND coordonnee_id = coordonnee.id");

    Et voici le code de la fonction requete_sql

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    QSqlQuery requete_sql(const QString& requete, QSqlDatabase db){
        QSqlQuery query(db);
     
    qDebug()<<requete;
        IF(NOT query.exec(requete)){
            QMessageBox::critical(0, "Error", query.lastError().text(), QMessageBox::Cancel);
            std::abort();
        }
        progress* p = dynamic_cast<Formafast*>(qApp)->p();
        IF(p)
            p->advance();
     
        RETURN query;
    }
    Savez vous d’où cela peut provenir ?

    Merci par avance à tous

  2. #2
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2011
    Messages : 1 894
    Points : 2 980
    Points
    2 980

    Par défaut

    salut,

    je crois que tu t'es planté de forum ici c'est mysql et pas sqlite, ce sont 2 sgbd différents...

    vaut mieux te faire aider par ceux qui utilisent sqlite non?

    sinon question sql pur:
    • les jointures s'écrivent depuis 20 ans avec l'opérateur join dans tous les sgbd...
    • client est un mot clé, tu dois le mettre entre ``
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  3. #3
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 773
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 773
    Points : 22 995
    Points
    22 995

    Par défaut

    1) J'ajouterais que ce qui peut nuire aux performances est la sous-requête corrélée dans ta vue.
    2) Première chose à examiner quand on a des problèmes de performances : les index !

    3) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.

    4) Un code indenté et aéré est plus agréable à lire et à débugguer.

    Il y a encore du boulot sur la requête (voir les commentaires) mais ça devrait donner quelque chose de ce genre :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE VIEW liste_client AS
    SELECT -- Préciser de quelle table vient chaque colonne en utilisant l'alias de table
    	civ, nom, prenom, denomination, tel, fax, mobil,  mail,
    	num_adresse, complement_adresse, adresse, cp, ville, ape, siret, siren_lieu,
    	capital, activite, coordonnee_id, entreprise_id, type_entreprise_id, actif, derniere_modif,
    	client.id AS id,
    	COUNT(i.client_id) AS nbr_inscription
    FROM coordonnee co
    -- Pas sûr des conditions de jointure : préciser l'alias de la table aide à la compréhension de la requête !
    INNER JOIN entreprise e ON entreprise_id = entreprise.id 
    INNER JOIN client cl ON coordonnee_id = coordonnee.id
    	INNER JOIN inscription i ON i.client_id = cl.id
    WHERE i.etat = 0
    GROUP BY -- Préciser de quelle table vient chaque colonne en utilisant l'alias de table
    	civ, nom, prenom, denomination, tel, fax, mobil,  mail,
    	num_adresse, complement_adresse, adresse, cp, ville, ape, siret, siren_lieu,
    	capital, activite, coordonnee_id, entreprise_id, type_entreprise_id, actif, derniere_modif
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 64
    Points : 2
    Points
    2

    Par défaut

    Salut,

    Je ne pense pas que le problème viennent des requêtes car celle ci en sqlite vont très vite.
    Par ailleurs, j'ai un site hébergé sur ce même serveur et les même requête vont beaucoup plus vite....

    Aucune idée ?

  5. #5
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 773
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 773
    Points : 22 995
    Points
    22 995

    Par défaut

    3 mois après...
    As-tu essayé ma vue ?
    As-tu vérifié l'indexation des tables ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 64
    Points : 2
    Points
    2

    Par défaut

    Salut,

    Hé oui lol j'ai toujours ce fameux problême

    J'ai essayé la requête dans PHPMyadmin, voici l'erreur :
    #1054 - Unknown column 'client.id' in 'field list'

    Ne comprenant pas trop la requête, je ne sais pas ou je doit déclarer la table client.....

    Merci d'avance

  7. #7
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 773
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 773
    Points : 22 995
    Points
    22 995

    Par défaut

    J'avais pourtant mis des commentaires dans la vue pour que tu l'adapte à ton cas réel, notamment en indiquant à quelles tables appartiennent les colonnes invoquées dans toute la requête.

    Ceci dit, pour ton erreur :
    #1054 - Unknown column 'client.id' in 'field list'
    Elle est censée figurer dans la table inscription d'après ma vue :
    Code :
    INNER JOIN inscription i ON i.client_id = cl.id
    Et cette jointure vient de ta requête :
    Code :
    (SELECT count(*) FROM inscription WHERE client_id = client.id AND etat = 0)
    C'est tout ce que je peux dire en l'état !

    Si tu nous donnes la structure des tables, une explication claire de ce qu'est censée faire cette vue, éventuellement un petit jeu de données et le résultat attendu, on pourra mieux t'aider.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •