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

Requêtes MySQL Discussion :

Requete lente QT C++ et sql


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 65
    Points : 30
    Points
    30
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    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 : 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
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 65
    Points : 30
    Points
    30
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 65
    Points : 30
    Points
    30
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN inscription i ON i.client_id = cl.id
    Et cette jointure vient de ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

Discussions similaires

  1. [AC-2003] Requete ACCESS trop lente par rapport a SQL SERVER 2005
    Par apnw7931 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 07/03/2011, 18h48
  2. [Requete] probleme de synthaxe sous SQL SERVER 2005
    Par sanosuke dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/05/2007, 11h24
  3. Requete ne passe pas sous Sql 2005
    Par dd16 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 02/06/2006, 13h03
  4. Requetes Lentes avec LDAP
    Par ripou dans le forum Développement
    Réponses: 1
    Dernier message: 13/12/2005, 18h49
  5. Réponses: 1
    Dernier message: 17/06/2005, 10h35

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