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

Langage SQL Discussion :

Simplifier une requete


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Par défaut Simplifier une requete
    Bonjour,

    Je ne m'y connais pas beaucoup en sql et je voudrais simplifier une requête.
    La situation :
    J'ai deux tables dont l'une a 1 300 000 lignes (HT02_EXPDM) et l'autre 1 400 000 lignes (VI02_LGFAC) .
    Je fais la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO HT02_EXPDM (HT02IDFACT, HT02IDLGN)
      SELECT VI02IDFACT_VI01IDFACT, VI02IDLGN
      FROM VI02_LGFAC
      WHERE VI02_LGFAC.VI02IDFACT_VI01IDFACT NOT IN (SELECT DISTINCT HT02IDFACT FROM HT02_EXPDM);
     
    COMMIT;
    Je parcours donc une table A de 1 400 000 lignes et j'insère dans la table B de 1 300 000 lignes les enregistrements de A si ils ne sont pas déjà dans la table B de 1 300 000 lignes

    Je lance cette commande à la main dans Sql developper pour alimenter ma table oracle.
    Le problème c'est que le traitement n'aboutit pas, une barre m'indiquant que le traitement est toujours en cours ( au bout de 12h).
    Pour m'assurer que la requête marche je l'ai faite tourner avec deux tables contenant 5000 d'enregistrement et cela a prit 5 secondes environs donc si on fait un petit calcul on s'imagine que 12 h c'est largement assez pour que le traitement est pu finir avec 1 300 000 lignes.

    1 - Je voudrais donc savoir si cette requête peut être simplifiée pour être moins gourmande et moins lourde ?
    2 - Est il possible de découper ce genre de requête ?
    3 - D'où pourrais venir mon problème ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 143
    Par défaut
    Deux autres manières de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO ht02_expdm 
        (   ht02idfact
        ,   ht02idlgn
        )
    SELECT  vi.vi02idfact_vi01idfact
        ,   vi.vi02idlgn
    FROM    vi02_lgfac  AS vi
    WHERE   NOT EXISTS  
            (   SELECT  1 
                FROM    ht02_expdm  AS ht
                WHERE   vi.vi02idfact_vi01idfact = ht.ht02idfact
            )
    ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSERT INTO ht02_expdm 
        (   ht02idfact
        ,   ht02idlgn
        )
    SELECT  vi.vi02idfact_vi01idfact
        ,   vi.vi02idlgn
    FROM    vi02_lgfac  AS vi
        LEFT JOIN
            ht02_expdm  AS ht
            ON  vi.vi02idfact_vi01idfact = ht.ht02idfact
    WHERE   ht.ht02idfact   IS NULL
    ;
    Dans tous les cas, il est préférable que les colonnes comparées soient indexées
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Par défaut
    Salut al1,

    Qu'est ce qui fait que tes requetes vont etre plus rapide a execute que celle de onimou.
    Exists est il plus performant que in?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 143
    Par défaut
    EXISTS effectue une jointure, au même titre que LEFT JOIN, en s'appuyant sur les index s'ils existent.
    Dans le cas du NOT IN (SELECT DISTINCT ...), le SGBD (à moins qu'il ait un optimiseur super efficace qui transforme la requête en jointure) va commencer par créer une table temporaire avec la sous-requête, puis effectuer le regroupement réclamé par le DISTINCT, avant de comparer la liste à la table.

    Mais tout dépend de l'optimiseur du SGBD et des informations qu'il a à sa disposition (index, statistiques) pour choisir la meilleure tactique.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Par défaut
    Donc si je comprends (desole de pourrir ton post onimou)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM interventions WHERE idintervenant IN (SELECT idintervenant FROM intervenants WHERE idutilisateur = 1 )
    AND date>='2008-05-12 00:00:00' AND date<='2008-05-14 23:59:59' ORDER BY date DESC
    sera apriori moins performant que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM interventions WHERE idintervenant EXISTS (SELECT idintervenant FROM intervenants WHERE idutilisateur = 1 )
    AND date BETWEEN '2008-05-12 00:00:00' AND '2008-05-14 23:59:59' ORDER BY date DESC
    du fait de la creation d'une table intermediaire a cause du IN, (idem pour le between?)

  6. #6
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    oui
    Mais cela depend de l'optimiseur de votre SGBD

Discussions similaires

  1. Simplifier une requete
    Par Msieurduss dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/12/2009, 12h56
  2. [AC-2003] Simplifier une 10 de requetes MAJ
    Par Bernard67 dans le forum VBA Access
    Réponses: 7
    Dernier message: 08/07/2009, 07h37
  3. Simplifier une requete
    Par VIRGINIE87 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 15/05/2007, 07h45
  4. [MySQL] Simplifier une requete
    Par philippef dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/07/2006, 15h42
  5. [VB6] [Excel] Résultat d'une requete ds une feuille
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/01/2003, 17h52

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