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 :

Lenteur d'une requete Not exists : syntaxe SQL ou mauvaise conception de table ? [MySQL-5.7]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 18
    Par défaut Lenteur d'une requete Not exists : syntaxe SQL ou mauvaise conception de table ?
    Bonjour,

    Je débute sous Wamp et je cherche à faire une surveillance de performance de scanner d'ordonnance.

    Chaque nuit mon script php parcours toutes les ordonnances et crée une table temporaire contenant les ordo des 6 derniers jours : tmp_SO_Dem_Inlog.
    Je lance le script chaque nuit à J-6 pour éviter de perdre des ordo le jour où le script ne sera pas lancé pour X raisons.
    Sur cette table temporaire, seul le dernier jour sera intégré à la table définitive, la plupart du temps.

    Une table liste les ordonnances définitives SO_Dem_Inlog.

    Chaque jour donc j'alimente la table définitive des seules nouvelles demandes contenues dans la table temporaire.

    Je réalise donc une requête pour trouver le delta et boucle ensuite par une requête insert pour alimenter la table définitive SO_Dem_Inlog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select DEMANDE, SOMME_SO from tmp_SO_Dem_Inlog where not exists (select 1 from SO_Dem_Inlog where tmp_SO_Dem_Inlog.DEMANDE=SO_Dem_Inlog.DEMANDE)
    Je m’aperçois que cette requête de non existence des ordo est de plus en plus longue (ordre d'idée : 30 minutes) : la table définitive contient 100000 lignes et la temporaire 10000 environ.
    Ci dessous la structure ainsi que les données pour tester au besoin.
    Desktop.7z

    Je ne sais pas si je dois revoir la structure de mes tables, optimiser avec des index ou revoir ma syntaxe sql...

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 18
    Par défaut Erreur de débutant
    J'ai cru avoir résolu ce problème en créant des index... je me suis trompé.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Citation Envoyé par pypeseux Voir le message
    Je réalise donc une requête pour trouver le delta et boucle ensuite par une requête insert pour alimenter la table définitive SO_Dem_Inlog
    C'est ambigüe, est-ce que ça veut dire une boucle avec un INSERT INTO VALUES dedans ?

    Si oui, il faut faire un INSERT INTO SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into SO_Dem_Inlog (....)
    select DEMANDE, SOMME_SO , ...
      from tmp_SO_Dem_Inlog 
     where not exists (select 1 
                         from SO_Dem_Inlog 
                        where tmp_SO_Dem_Inlog.DEMANDE = SO_Dem_Inlog.DEMANDE)
    PS : Pour la structure des tables et index, merci de préférer un post direct dans le forum avec la balise code plutôt qu'un fichier joint.

  4. #4
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 18
    Par défaut
    Bonjour,

    Votre solution m'a effectivement bien simplifié le code, et j'ai nettement amélioré mes performances...
    J'ai ajouté également ajouté un index... tout est OK

    Merci beaucoup

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Vous pouvea aussi récrire votre requête sous la forme d'une semi anti jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select DEMANDE, SOMME_SO 
    from   tmp_SO_Dem_Inlog AS SO1
           LEFT OUTER JOIN SO_Dem_Inlog.DEMANDE AS SO2
                ON SO1.DEMANDE=SO2.DEMANDE  
    where  S02.DEMANDE IS NULL;
    Voire en utilisant l'opérateur ensembliste EXCEPT...

    mais le plus important reste l'indexation de TOUTES les tables, y compris les tables temporaires !

    Apprenez le langage SQL. Mon site web comme mon livre peuvent vous y aider...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Requete NOT EXISTS retournant un résultat vide
    Par uptoditime dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/12/2007, 18h08
  2. Requete NOT EXISTS qui ne retourne aucun enregistrements
    Par uptoditime dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 03/12/2007, 15h18
  3. Division soit deux not exists en SQL et un petit plus
    Par Pingouin22 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2006, 13h37
  4. [MySQL v4.1.9] Lenteur d'une requête SQL
    Par Ithomir dans le forum Langage SQL
    Réponses: 9
    Dernier message: 04/07/2006, 10h05
  5. Traduction d'une requete Update jet en sql server
    Par verbatim56 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/01/2006, 12h10

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