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

SQL Oracle Discussion :

Optimisation requête sql [11g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    971
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 971
    Par défaut Optimisation requête sql
    Bonjour,

    j'ai une grosse requête et lorsque je sélectionne mes champs ( dans mon select), il m'arrive d'avoir plein pas mal de sous requête, du 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
     
    ...........
    NVL((SELECT t6.rue 
    FROM tableAdresse t6
    WHERE t6.x550_id=ta.x503_id
    and t6.typeadresse ='012'
    AND rownum=1),' ') AS ADR_PERSO,
     
    NVL((SELECT t6.rue 
    FROM tableAdresse t6
    WHERE t6.x550_id=ta.x503_id
    and t6.typeadresse ='013'
    AND rownum=1),' ') AS ADR_pro,
    ...
    ...
    from table2 ta
    inner join ....
    donc je me suis renseigné un peu pour une question d'optimisation et j'ai cru comprendre que c'etait mieux de faire des jointures du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select ta.identifiant,
    t6.rue as rue_perso,
    t5.rue as rue_pro
    etc....
    ....
    from table2 ta
    inner join tableAdresse t6 on .... and t6.typeadresse = '012'
    inner join tableAdresse t5 on .... and t5.typeadresse = '013'
    à votre avis est-ce mieux la méthode 2, donc avec des jointures ou la méthode 1?

    Merci à vous

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Bonjour,


    La 1ère requête contient surtout des rownum=1, elle ne ramènera donc pas potentiellement le même résultat que la seconde qui est à base de jointure mais sans la restriction sur le nombre de lignes à extraire.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    971
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 971
    Par défaut
    J'ai oublié de préciser, par exemple j'ai ceci à la fin de la requête :

    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
    18
    19
     
    ...........
    NVL((SELECT t6.rue 
    FROM tableAdresse t6
    WHERE t6.x550_id=ta.x503_id
    and t6.typeadresse ='012'
    AND rownum=1),' ') AS ADR_PERSO,
     
    NVL((SELECT t6.rue 
    FROM tableAdresse t6
    WHERE t6.x550_id=ta.x503_id
    and t6.typeadresse ='013'
    AND rownum=1),' ') AS ADR_pro,
    ...
    ...
    from table2 ta
    inner join ....
    where numpers=....
    and date=....
    et pour la seconde methode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select ta.identifiant,
    t6.rue as rue_perso,
    t5.rue as rue_pro
    etc....
    ....
    from table2 ta
    inner join tableAdresse t6 on .... and t6.typeadresse = '012'
    inner join tableAdresse t5 on .... and t5.typeadresse = '013'
    ....
    where numpers=....
    and date=....
    donc en gros , pour une question d'optimisation et de temps d’exécution, la seconde méthode serait la plus adapté selon vous ?

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Je ne peux répondre à cette question, il faudrait en premier lieu regarder les plans d'exécution des deux requêtes.
    Si la deuxième méthode semble plus naturelle, la première en passant par des sous-requêtes est parfois nécessaire pour obtenir le résultat voulu.


    Obtenez-vous le même résultat entre les deux déjà ?

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Vous utilisez un rownum = 1 mais sans critère de tri, votre 1ere requête est donc potentiellement non consistante dans le temps, plusieurs exécutions peuvent renvoyer des données différentes si vous avez bien plusieurs valeurs possibles.

    Ensuite, la transformation d'une sous requête scalaire (un SELECT dans un SELECT) se traduit par une jointure externe, il faut donc remplacer les INNER JOIN par des LEFT JOIN pour ne pas filtrer les lignes en cas d'absence d'adresse pro par exemple.

    Concernant la partie optimisation, ce n'est pas si simple, et dépend de l'utilisation faites de la requête ainsi que potentiellement du nombre de ligne renvoyé et/ou paginé.
    En gros la 1ere requête pourrait répondre plus vite pour renvoyer les 1eres lignes, celle avec jointure sera peut être plus performante pour traiter l'ensemble des lignes comme par exemple alimenter une table dans un job ETL.

  6. #6
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2009
    Messages : 73
    Par défaut
    Salut,

    Au vue de la 1ère requête, la sous-requête doit retourner plus d'une ligne d’où le ROWNUM.

    Je propose si toutefois ta requête sera très souvent utilisée que tu crées une fonction sur la rue pour ne retourner qu'une seule valeur (exacte).

    Ceci va non seulement alléger la structure de la requête et tu gagneras aussi en temps d'exécution.

    Voir le TIMING sous SQLPLUS

    SINON A L’ÉTAT ACTUEL, LES DEUX REQUÊTES SONT QUASI DIFFÉRENTES ET NE RETOURNENT PAS DU TOUT LE MÊME RÉSULTAT

  7. #7
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    971
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 971
    Par défaut
    Bonjour,

    merci pour vos retour je vais étudier la question

  8. #8
    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 : 47
    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
    Citation Envoyé par android59 Voir le message
    à votre avis est-ce mieux la méthode 2, donc avec des jointures ou la méthode 1?
    Probablement aucune des deux, vous avez a priori besoin d'un PIVOT.

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

Discussions similaires

  1. Optimisation requête SQL
    Par ludo00002 dans le forum SQL
    Réponses: 2
    Dernier message: 06/10/2008, 09h01
  2. Comment optimiser requête SQL avec création Index
    Par schumi101 dans le forum SQL
    Réponses: 25
    Dernier message: 11/12/2007, 21h28
  3. optimisation requête SQL
    Par marti dans le forum Oracle
    Réponses: 4
    Dernier message: 27/04/2006, 08h54
  4. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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