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 :

Fonctionnement et performances -- WHERE date = (SELECT MAX(date)


Sujet :

SQL Oracle

  1. #1
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut Fonctionnement et performances -- WHERE date = (SELECT MAX(date)
    Bonjour,

    Je voudrai me cultiver un peu

    Mettons une requête de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM LOG_BOOK t1
    WHERE DATE_TIME = (SELECT MAX(DATE_TIME)
                       FROM LOG_BOOK t2
                       WHERE t1.EVENT_ID = t2.EVENT_ID
                         AND s1.STATUS = s2.STATUS);
    La table est un journal qui contient l'historique des statuts de chaque événement. Quand un événement a eu plusieurs fois le même statut, on ne veut garder que le plus récent.

    J'aimerai comprendre comment Oracle traite les sous-requêtes car j'ai l'impression que ce genre de chose peut vite devenir un gouffre à performances. De manière générale, comment sont traitées les sous-requêtes ? Une exécution pour chaque ligne de la requête principale en filtrant sur l'EVENT_ID ? Une seule exécution puis un JOIN sur EVENT_ID ? Les deux sont possibles selon ce que l'optimiseur pense le plus performant ?
    Il n'y a pas des problèmes de cardinalité qui peuvent induire l'optimiseur en erreur sur ce genre de requête ?

    Selon le fonctionnement d'Oracle, quelles sont les pistes d'optimisation de ce genre de requête ?

    Merci par avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Citation Envoyé par FSiebert Voir le message
    Selon le fonctionnement d'Oracle, quelles sont les pistes d'optimisation de ce genre de requête ?
    Avec une fonction de fenêtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With SR AS
    (
    SELECT t1.*
         , row_number() over(partition by t1.EVENT_ID, t1.STATUS order by t1.DATE_TIME desc) as rn
      FROM LOG_BOOK t1
    )
    select *
      from SR
     where rn = 1;
    S'il n'y a pas beaucoup de colonnes, une requête avec la fonction d'agrégat FIRST pourrait être intéressant également.

    Notez que selon les jeux de données la requête que vous avez écrite peut être plus rapide, notamment si vous avez un index sur le triplet {EVENT_ID, STATUS, DATE_TIME}.

    Citation Envoyé par FSiebert Voir le message
    De manière générale, comment sont traitées les sous-requêtes ?
    De manière générale, difficile de répondre. Il y a des sous-requêtes simples, des sous-requêtes corrélées (votre cas) qui ne se comportent pas de la même façon. L'analyse du plan d'exécution, vous donnera déjà une bonne idée de ce qui se passe !

Discussions similaires

  1. Requête SELECT . . . WHERE X = (Select max(X))
    Par Taylorised dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 13/06/2012, 17h20
  2. Zone de selection avec date debut et date fin
    Par lanaine07 dans le forum IHM
    Réponses: 1
    Dernier message: 25/05/2011, 09h50
  3. [AC-2003] Max date from multiple date fields?
    Par Mounamidou dans le forum IHM
    Réponses: 10
    Dernier message: 21/12/2010, 19h28
  4. Mettre select max(date) dans un paramètre
    Par info dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 25/06/2008, 16h41
  5. Select max(date) max(heure)
    Par silver.spike dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/06/2007, 20h26

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