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 de requête SQL


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut Optimisation de requête SQL
    BOnjour,

    J'ai une requete sql qui ressemble à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select distinct(local.id_local) from local,parcelle,compte_proprietaire,compte,compte_parcelle,proprietaire 
    where parcelle.id_parcelle=local.id_parcelle
    and compte_proprietaire.id_compte= compte.id_compte
    and compte_parcelle.id_compte= compte.id_compte
    and compte_parcelle.id_parcelle= parcelle.id_parcelle
    and proprietaire.id_proprietaire= compte_proprietaire.id_proprietaire
    and local.co_nature_local like 'AP'
    and local.co_nature_occupation like 'V'
    J'aimerai l'optimiser, car si je me souviens bien en utilisant des JOIN on gagne en temps d’exécution, et se serait génial pour moi car j'ai plus de 7000 parcelles à traiter.

    Cette requête n'est qu'une partie de tout mon traitement, mais il me suffi d'un seul modèle d'optimisation pour le reproduire sur tout mon traitement.

    Je fait appel à la communauté car les clause JOIN ne sont pas ma tasse de thé, je sais comment les construire mais j'aimerai bien avoir quelques pistes, ou encore mieux des autres idées d'optimisation !!

    J'ai recherché dans votre forum des cas utilisant des clauses JOIN mais je n'arrive pas à faire le rapprochement avec mon cas ! J'espère que je ne pollue pas le forum avec ma demande
    J'espère aussi que mes explication sont claires, si ce n'est pas le cas, n'hésitez pas à me le faire remarquer !


    Cordialement et en vous remerciant d'avance .

  2. #2
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut
    donc j'ai commencé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct(local.id_local) from local
    JOIN parcelle 
    ON local.id_parcelle = parcelle.id_parcelle
    mais le soucis c'est que pour le join suivant je fait appel a une nouvelle table "local
    donc je ne peut pas faire ce genre de jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select distinct(local.id_local) from local
    JOIN parcelle 
    ON local.id_parcelle = parcelle.id_parcelle
    JOIN compte_proprietaire
    ON  compte.id_compte = compte_proprietaire.id_compte
    Je ne reprend pas la table parcelle mais compte....

    ALors ma nouvelle question est, est-il judicieux de faire plusieurs select ou alors je reste sur ma clause where avec des and ? je ne sais pas ce qui est le plus rapide en temps d’exécution

  3. #3
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Citation Envoyé par Zombiman Voir le message
    Je ne reprend pas la table parcelle mais compte....
    Sans prendre en compte la partie optimisation de la requête, ta requête est faisable avec les JOIN, il suffit de mettre les tables dans la bonne logique.

    Sinon pour l'optimisation, le fait d'utiliser LIKE à la place de = ne doit pas forcément être très bon.

    Peux-tu nous mettre ton plan d'exécution ?

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Est-il bien nécessaire de faire des jointures à tour de bras quand on veut seulement s'assurer de l'existence des jointures - vu qu'au final on ne prend qu'un id qui doit être la clé primaire, avec un DISTINCT ?

    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
     
    SELECT id_local 
     FROM LOCAL L
    WHERE EXISTS ( SELECT 1
                    FROM parcelle p
                      INNER JOIN compte_parcelle cpar 
                           ON cpar.id_parcelle= p.id_parcelle
                      INNER JOIN compte c
                           ON c.id_compte = cp.id_compte
                      INNER JOIN compte_proprietaire cpro
                           ON cpro.id_compte = c.id_compte
                      INNER JOIN proprietaire p
                           ON p.id_proprietaire = cpro.id_proprietaire
                     WHERE proprietaire parcelle.id_parcelle=L.id_parcelle
                    )
    AND L.co_nature_local LIKE 'AP'
    AND L.co_nature_occupation LIKE 'V'

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par Zombiman Voir le message
    ...si je me souviens bien en utilisant des JOIN on gagne en temps d’exécution...
    Ce n'est pas comme ça qu'il faut prendre le problème.
    Mais :
    - ma requête prend actuellement x secondes
    - voici son plan d'exécution
    - comment puis-je l'améliorer, j'aimerais descendre à y secondes

  6. #6
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut
    D'accord, je vais réflechir à tout ça !

  7. #7
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Ce n'est pas comme ça qu'il faut prendre le problème.
    C'est surtout faux ... Lors de sa phase de réécriture, Oracle transforme les syntaxes de type JOIN en jointures "classiques".

Discussions similaires

  1. [phpBB] Optimiser les requêtes SQL
    Par Jimalexp dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 22/09/2008, 07h33
  2. [phpBB] Optimiser les requêtes SQL
    Par Jimalexp dans le forum Langage SQL
    Réponses: 0
    Dernier message: 22/09/2008, 01h42
  3. optimisation de requête SQL
    Par millien dans le forum SQL
    Réponses: 4
    Dernier message: 03/03/2008, 12h48
  4. Optimisation de requêtes SQL - utilisation de IN SELECT
    Par cfeltz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/12/2006, 09h28
  5. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55

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