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

PL/SQL Oracle Discussion :

Performance sur dates dans clause Where


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Par défaut Performance sur dates dans clause Where
    Bonjour,
    J'ai une requête assez lourde qui utilise des tables des +100 000 000
    d'enregistrements.
    Je souhaite extraire des données sur une base mensuelle.
    Quand je mets en guise de test dans mon Where une instruction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where madate = '01/12/2010'
    J'ai le résultat quasi instantanément

    mais avec, pour tout décembre du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Where madate >= '01/12/2010
    and madate < '01/01/2011'
    Ca ne renvoie plus rien avant des heures et des heures

    Je recherche la méthode optimatale pour manipuler les dates dans des clauses Where .

    Merci
    Laurent

    PS: je ne suis que requêteur occasionel et sans droits particuliers donc je n'ai pas idée de comment le modèle de données est fichu (index...) c'est un vrai bordel.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2009
    Messages : 35
    Par défaut
    Je crois bien que dans ton cas il y a une conversion implicite qui mange pas mal de temps.

    Tu peux donc essayer dans un premier temps de faire la conversion toi même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    madate > TO_DATE('01/12/2010', 'dd/mm/yyyy')
    Après il faut voir, j'ai pas trop d'idées

    En espèrant que ça t'aide

    Diplomegalo

  3. #3
    Membre expérimenté Avatar de JerryMouse
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 215
    Par défaut
    Effectivement.
    mais moi je ne te recommande pas l'utilisation de cette conversion automatique de type appelée transtypage automatique.
    en effet, en ce qui concerne les dates, le résultat de ce transtypage dépend du format de date par défaut du poste qui exécute la commande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE madate = '01/12/2010'
    peut vouloir dire 01 décembre 2010 si le format de la date de la machine est du DD/MM/YYYY
    tout comme cela peut signifier 12 janvier 2010 si le format est du MM/DD/YYYY. cela peut donc donner des résultats inattendu.

    Et si par contre le format et du YY/MM/DD, là mon gars, t'es foutu.
    il faut donc toujour utiliser soit du to_date(), soit du to_char() quand tu veux manipuler des dates.

  4. #4
    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
    Lors de la première requête vous demandez à l'optimiseur de répondre à une égalité.

    Son estimation va donc être la suivante :
    • Soit il devra parcourir tous les blocs de la table pour ramener les valeurs égales à 01/12/2010 (Full table scan) ou de la partition s'il y a du partitionnement sur la date.
    • Soit il devra parcourir l'index (en supposant qu'il y en ait un) pour obtenir l'entrée 01/12/2010 (index scan) et aller chercher le ou les blocs associés dans la table (table fetch by rowid)


    Si un index existe effectivement, celà peut être assez rapide et c'est certainement ce qui se produit dans votre cas.

    Dans la seconde requête vous demandez à l'optimiseur de calculer le chemin pour un interval couvrant un mois.

    Pour l'optimiseur, le choix devient donc le suivant
    • Soit il devra parcourir tous les blocs de la table pour ramener les valeurs de décembre 2010 (Full table scan) ou de la partition s'il y a du partitionnement sur la date.
    • Soit il devra parcourir l'index (en supposant qu'il y en ait un) pour obtenir toutes les entrées de décembre (index range scan) et aller chercher le ou les blocs associés dans la table (table fetch by rowid)


    Il es possible dans ce second cas que l'optimiseur estime que le full table scan est moin coûteux que l'accès par index et choisisse donc de parcourir soit vos 100 000 000 d'enregistrements soit tous les enregistrements d'une partition correspondant à votre date.

    Afin de pousser un peu plus le diagnostique vous devez savoir

    • Si votre table est partitionnée et quel est la clé de partitionnement.
    • Combien d'enregistrements sons sensés être remontés dans par votre seconde requête.
    • Combien d'enregistrement contient en moyenne un bloc.
    • Combien de valeurs distinctes de date existent en tout.
    • Quelles sont les statistiques sur les objets pouvant entrer en jeu dans cette requête.
    • ...


    L'outil SQLT disponible sur metalink note 215187.1 peut vous aider à récupérer l'ensemble de ces données et commencer à comprendre ce qui se passe au niveau de l'optimiseur Oracle pour votre requête.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2014, 10h25
  2. Format date dans clause Where
    Par aurelie83 dans le forum DB2
    Réponses: 5
    Dernier message: 06/01/2009, 20h48
  3. Select avec "date d'un premier élément" dans clause Where
    Par adrien357 dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/11/2008, 15h27
  4. [SQL 9i ] format de date dans un where
    Par booth dans le forum Oracle
    Réponses: 5
    Dernier message: 14/10/2005, 10h23
  5. INNER JOIN ... ON ... ou jointure dans clause where
    Par schmur1 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 28/06/2005, 09h16

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