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 :

Optimisation d'une requête select


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut Optimisation d'une requête select
    Bonjour,
    J'ai 4 tables Parent(Id, Code, Libelle, Montant), ChildA(Id), ChildB(Id), ChildC(Id) qui sont volumineuses. Les tables Child sont des tables filles de la table Parent (en Orienté objet). Ils partagent le même Id de la table parent.

    Je veux récupérer toutes les lignes de la table Parent sauf les lignes qui correspondent à la table ChildC.
    Est ce qu' il y a une solution plus performante que "select * from Parent where Id not in(select Id from ChildC)" pour répondre à cette demande ?
    Merci

  2. #2
    Membre éclairé Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut
    Je pense que cette requête sera moins couteuse que la requête avec "not in".
    select * from Parent p left outer join ChildC c on p.Id=c.Id where c.Id is null

    Que pensez vous ?

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si votre base de données n'est pas trop dans les fraises, je dirais kif-kif.
    Vous avez encore une autre syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
      from Parent
     where not exists (select 1
                         from ChildC
                        where ChildC.Id = Parent.Id)

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 042
    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 042
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Parent where Id not in(select Id from ChildC)
    Celle ci-avant sera meilleure que celle ci-après...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Parent p left outer join ChildC c on p.Id=c.Id where c.Id is null
    En effet la première ne ressortira que les colonnes de la table Parent...

    La seconde renverra toutes les colonnes (vide=>NULL pour les colonnes de la table des enfants)...

    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/ * * * * *

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 778
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Il est fréquent que la solution basée sur NOT EXISTS soit la plus performante.
    Avec DB2 for Z/OS que je fréquente le plus, ça semble même être systématiquement le cas dans des proportions très importantes comparativement à NOT IN dès que le volume des tables est significatif.
    À vérifier dans votre contexte.

  6. #6
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Autre approche pour comparer : au lieu d'exclure des données, précisez celles que vous souhaitez, et utiliser un UNION
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT P.* FROM parent AS P INNER JOIN childA AS C ON C.id = P.id
    UNION
    SELECT P.* FROM parent AS P INNER JOIN childB AS C ON C.id = P.id

    Après, il faut faire un benchmark pour vérifier quelle approche est la plus performante.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/10/2013, 11h47
  2. optimiser une requête SELECT
    Par molesqualeux dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/02/2011, 15h11
  3. Optimisation d'une requête SELECT sur une grosse table
    Par eracius dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/05/2008, 14h51
  4. Optimisation d'une requête SELECT
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/10/2007, 10h08
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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