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 :

Problème de performance avec un to_date dans where clause


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut Problème de performance avec un to_date dans where clause
    Bonjour à tous,

    J'ai un soucis de performance avec une de mes requêtes SQL.

    Cette requête exécute une recherche dans une table d'audit contenant une date de validité afin de construire une vue.

    Les données sources sont stockées dans une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id       val01        end_ts
    1        1            01-JAN-2011
    2        3            03-MAR-2011
    3        5            15-AUG-2050
    4        3            15-AUG-2050
    Dans l'exemple ci-dessus, end_ts représente la date de validité.
    Les données courantes sont celles ayant end_ts = 15-AUG-2050 (une date future qui est la même pour tous les records courants - me demandez pas pourquoi cette date...), soit les records 3 & 4.

    La vue ne doit afficher que les données courantes et leur appliquer une fonction d'aggrégation (une somme).

    Afin de ne récupérer que les données courantes, je dois donc filtrer les données, ce que je fais comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select sum(val01) 
    from ma_table 
    where end_ts = to_date('15-AUG-2050', 'DD-MMM-YYYY');
    Le soucis, c'est que l'utilisation de la fonction to_date réduit de manière trop importante les performances de ma requête.
    Quand j'exécute la requête sans where clause, quelques secondes suffisent.
    Par contre, avec where clause, plusieurs dizaines de minutes sont nécessaires (j'ai environ 400 000 records dans ma_table)

    Je commence donc à envisager de ne plus faire de vue, mais une seconde table, rafraichie avec une procédure SQL (qui me permettrait de stocker le résultat de to_date('15-AUG-2050', 'DD-MMM-YYYY') dans une variable, puis d'utiliser cette variable dans la where clause)

    Cependant, me gène de ne plus avoir de vue, je serais obligé de forcer un rafraichissement (job schedulé), et surtout, je me demande s'il n'y a pas de possibilité pour faire autrement!

    Merci par avance pour votre aide

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Plusieurs dizaines de minutes pour 400K lignes, ça parait monstrueux...

    Par contre, to_date en soi ne ralentit pas de requêtes (essaie par exemple de faire la même sans clause where).

    Y a-t-il beaucoup de lignes courante par rapport au total des lignes ? Serait-il peut être souhaitable de poser un index sur la date ? Pourrais-tu donner le plan d'exécution de ta requête ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Franchement la même que Pacmann, il faut au moins un plan (set autot trace dans sqlplus) voir un tkprof

    Sinon c'était juste pour préciser que :
    Je commence donc à envisager de ne plus faire de vue, mais une seconde table, rafraichie avec une procédure SQL (qui me permettrait de stocker le résultat de to_date('15-AUG-2050', 'DD-MMM-YYYY') dans une variable, puis d'utiliser cette variable dans la where clause)

    Cependant, me gène de ne plus avoir de vue, je serais obligé de forcer un rafraichissement (job schedulé), et surtout, je me demande s'il n'y a pas de possibilité pour faire autrement!
    Ca s'appelle une vue matérialisée (mais c'est plus pour ta culture... il n'y a aucune raison pour que la requête présentée sur 400K lignes prennent 10 minutes...)

  4. #4
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Bonjour,

    Merci pour vos réponses!

    Alors, je vais d'abord répondre à Pacman:
    Par contre, to_date en soi ne ralentit pas de requêtes (essaie par exemple de faire la même sans clause where).
    Justement, c'est exactement le problème: j'ai identifié le to_date comme facteur limitant dans ma requête, cf mon post original:
    Quand j'exécute la requête sans where clause, quelques secondes suffisent.
    Pour répondre à skuatamad:
    Merci, je sais ce qu'est une vue matérialisée (ou snapshot) . Ceci dit, je ne suis pas certains qu'on puisse utiliser une variable.

    Je m'explique: une vue matérialisée exécute une requête SQL a une fréquence donnée (tous les jours,...) Bref, je vais pas expliquer plus dans les détails.

    En gros, ma vue matérialisée va exécuter le même script que ma vue Oracle, sauf que je vais le faire à un horaire prédéfini. Ma vue matérialisée sera beaucoup plus rapide en accès, par contre, il va me falloir toujours autant de temps pour la mettre à jour...

    Par contre, si je créé une table (non matérialisée), rafraichie par un script PL/SQL, ça me semble plus efficace, mais pas très propre sur la méthode:
    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
    declare
      max_ts date := to_date('15-AUG-2050', 'DD-MON-YYYY');
    begin
      begin
        drop table mon_autre_table;
      exception
        when OTHERS then
          null;
      end;
     
      create table mon_autre_table as 
        select pt, sum(val01) 
        from ma_table 
        where end_ts = max_ts
        group by pt
      ;
    end;
    Quoiqu'il en soit, je vais poster le plan d'exécution dès demain!

  5. #5
    Membre régulier
    Homme Profil pro
    Analyste
    Inscrit en
    Août 2003
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste
    Secteur : Services de proximité

    Informations forums :
    Inscription : Août 2003
    Messages : 85
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Et la création d'un index sur la fonction to_date(end_ts) vous l'avez peut-être déjà fait ?
    Air startout

  6. #6
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par startout Voir le message
    Bonjour,

    Et la création d'un index sur la fonction to_date(end_ts) vous l'avez peut-être déjà fait ?
    Bonjour,

    Je ne comprends pas votre remarque.

    La table d'origine contient la variable "end_ts", je ne vois pas comment je paux mettre un index sur "to_date(end_ts)"

    Si vous pouviez m'aider sur ce point!

  7. #7
    Membre expérimenté 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 : 50
    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
    Points : 1 597
    Points
    1 597
    Par défaut
    Bonjour ?

    Quels sont les plans d'exécution ?
    Si vous avez un index sur le champs end_ts quelle est sa taille et son type dans user_segments ? De quand datent les statistiques sur les différents objets impactés ?

  8. #8
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    A partir du moment ou vous transformez la colonne indexée dans votre clause where, vous perdrez l'utilisation des index (convert, upper, ...)
    Vous devez utiliser la valeur native pour que l'index soit utilisé

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  9. #9
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Bonsoir à tous,

    Voici la requête utilisée pour l'explain plan:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  a.id,
            c.var_01
    FROM    ma_table_a a,
            ma_table_b b,
            ma_table_c c
    WHERE   a.id = 1
        AND a.id = b.id
        AND a.id = c.id
        AND a.sub_id = b.sub_id
        AND b.collected_data = 'Y'
        AND c.end_ts = to_date (3000000, 'J')
    --    AND c.end_ts > sysdate
    ;
    Donc, premier explain plan avec le to_date dans la where clause.
    Temps d'exécution de la requête: 1 min et 52 sec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT STATEMENT CHOOSE
        cost: 14 155 bytes: 3 894 cardinality: 66
      6 - Hash join
          cost: 14 155 bytes: 3894 cardinality: 66
        4 - Nested loops
            cost: 13 914 bytes: 126 132 cardinality: 2 742
          2 - Table access by index rowid ma_table_a
             cost: 1 bytes: 19 cardinality: 1
            1 - Index unique scan ma_table_a_uk_idx
                cardinality: 1
          3 - Index range scan non-unique ma_table_b_nfk_idx
              cost 13 913 bytes 74 034 carinality: 2 742
        5 - Table access full ma_table_c
            cost: 237 bytes 1 088 620 cardinality 83 740
    Second explain plan sans le to_date dans la where clause.
    Temps d'exécution de la requête: 454 msecs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT STATEMENT CHOOSE
        cost: 15 713 bytes: 3 677 508 cardinality: 72 108
      6 - Hash join
          cost: 15 713 bytes: 3 677 508 cardinality: 72 108
        1 - Table access full ma_table_b
            cost: 237 bytes: 1088308 cardinality: 83716
        5 - Nested loops
            cost: 13 914 bytes: 96 058 110 cardinality: 2 527 845
          3 - Table access by index rowid ma_table_a
             cost: 1 bytes: 19 cardinality: 1
            2 - Index unique scan ma_table_a_uk_idx
                cardinality: 1
          4 - Index range scan non-unique ma_table_c_nfk_idx
              cost: 13 913 bytes 48 029 055 cardinality: 2 527 845
    Dernier explain plan sans le to_date dans la where clause, mais avec un sysdate.
    Temps d'exécution de la requête: 563 msecs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT STATEMENT CHOOSE
        cost: 15 958 bytes: 4 248 177 cardinality: 72 003
      6 - Hash join
          cost: 15 958 bytes: 4 248 177 cardinality: 72 003
        1 - Table access full ma_table_b
            cost: 237 bytes: 1 088 308 cardinality: 83 716
        5 - Nested loops
            cost: 13 914 bytes: 116 110 808 cardinality: 2 524 148
          3 - Table access by index rowid ma_table_a
             cost: 1 bytes: 19 cardinality: 1
            2 - Index unique scan ma_table_a_uk_idx
                cardinality: 1
          4 - Index range scan non-unique ma_table_c_nfk_idx
              cost: 13 913 bytes 68 151 996 cardinality: 2 524 148

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Juste par curiosité, tu as lancé les requêtes et les explain plan avec quel outil ?

    Question bonus : tu parlais de "sum" au départ... pourquoi n'as tu pas cherché les plans d'exécution des requêtes "sum" ?
    (Et au passage tu parlais de plusieurs dizaines de minutes... mais finalement ça fait moins de 2 minutes ?)

    @yanika et startout : ce n'est pas sur la colonne qu'on applique une fonction ici, c'est sur une constante... donc aucun problème par rapport au potentiel index.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  11. #11
    Membre expérimenté 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 : 50
    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
    Points : 1 597
    Points
    1 597
    Par défaut
    La requête qui pose problème est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  a.id,
            c.var_01
    FROM    ma_table_a a,
            ma_table_b b,
            ma_table_c c
    WHERE   a.id = 1
        AND a.id = b.id
        AND a.id = c.id
        AND a.sub_id = b.sub_id
        AND b.collected_data = 'Y'
        AND c.end_ts = to_date (3000000, 'J')
    --    AND c.end_ts > sysdate
    ;
    Visiblement elle induit un FTS sur c. On peut donc en déduire qu'il n'y a pas d'index saur c.end_ts ou que celui ci n'est pas suffisamment sélectif pour la valeur to_date(3000000,'J').
    La cardianlité estimée est de 83 740 lignes pour cette contrainte : est-ce réellement le cas ?

    En effet jusqu'en 11gR2 l'optimiseur n'est pas au courant affinités entre colonnes et il va donc estimer la sélectivité de n colonne comme le produit des sélectivités individuelles des colonnes. C'est une multiples raisons qui peut pousser l'optimiseur à prendre un plan d'exécution qui n'est pas optimal.

    On en revient donc au satistiques et aux index.

    Existe-t-il un index sur c.end_ts ? ou mieux sur c.id et c.end_ts ?
    Quelles sont les statistiques de la table, des index et des colonnes ?
    Quand et comment ont-elles été calculées ?
    Et surtout reflètent-elles suffisamment la réalité ?

    Que se passe-t-il si la requête est réécrite comme suit


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  a.id,
            c.var_01
    FROM    (select id, sub_id ma_table_a where id=1) a,
            inner join ma_table_b b on (a.id=b.id and a.sub_id=b.sub_id and b.id=1),
            inner join ma_table_c c on (a.id=c.id and c.id=1)
    WHERE   b.collected_data = 'Y'
        AND c.end_ts = to_date (3000000, 'J')
    --    AND c.end_ts > sysdate
    ;

  12. #12
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Les données provient des tables a et c seulement. Les filtre sont posées sur la table a la table b et la table c. Le filtre sur la table a est très fort, valeur unique de la clé primaire (a.id = 1). Le filtre sur la table b est très peu sélective (col = ‘Y’). Le filtre sur la table c (date = 15-08-3051) utilise une date bidon pour remplacer un null et a pour conséquence d’introduire une non-uniformité des données très forte. Sans histogrammes sur cette colonne l’optimiseur part tranquillement dans les choux.

    La requête qui n’utilise pas de date ne peut se baser que sur le filtre de la table b et le plan attaque cette table en full. La requête qui utilise sysdate implique le même plan due à la forte non-uniformité des données de la collone c.end_ts autrement dit il est plus intéressant de commencer avec la table b que avec la table c

    Bref, je n’ai pas vu de version de base Oracle mais je pense que c’est une base Oracle 9. Il est très probable que recalculer les statistiques avec génération des histogrammes là où besoin est devrait améliorer les choses.

  13. #13
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut,

    Juste par curiosité, tu as lancé les requêtes et les explain plan avec quel outil ?
    Salut, Les explain plan ont été exécuté avec TOAD.


    Citation Envoyé par pacmann Voir le message
    Question bonus : tu parlais de "sum" au départ... pourquoi n'as tu pas cherché les plans d'exécution des requêtes "sum" ?
    (Et au passage tu parlais de plusieurs dizaines de minutes... mais finalement ça fait moins de 2 minutes ?)
    J'ai simplifié la requête. Ce qui m'intéresse dans le cas présent, c'est l'impact de l'utilisation du to_date dans la where clause.


    Citation Envoyé par ojo77
    On en revient donc au satistiques et aux index.

    Existe-t-il un index sur c.end_ts ? ou mieux sur c.id et c.end_ts ?
    Quelles sont les statistiques de la table, des index et des colonnes ?
    Quand et comment ont-elles été calculées ?
    Et surtout reflètent-elles suffisamment la réalité ?
    Salut, il existe bien un index sur end_ts, mais non utilisé dans mon cas car c'est un index concaténé (sur plusieurs variables qui ne sont pas toutes utilisées). Mais cela me donne une piste, ça peut valoir le coup d'ajouter une ou deux variables dans la requête pour forcer l'utilisation de l'index.

    Les stats de la table sont mises à jour tous les jours. Je ne sais pas quelles sont les informations dont vous avez besoin, mais je peux déjà vous donner ça:
    AVG_ROW_LEN 76
    AVG_SPACE 1455
    AVG_SPACE_FREELIST_BLOCKS 0
    BACKED_UP N
    BLOCKS 697 312
    BUFFER_POOL DEFAULT
    CACHE N
    CHAIN_CNT 4 985
    CLUSTER_NAME
    CLUSTER_OWNER
    COMPRESSION DISABLED
    DEGREE 1
    DEPENDENCIES DISABLED
    DURATION
    EMPTY_BLOCKS 91
    FREELISTS
    FREELIST_GROUPS
    GLOBAL_STATS YES
    INITIAL_EXTENT 80 Kb
    INI_TRANS 1
    INSTANCES 1
    IOT_NAME
    IOT_TYPE
    LAST_ANALYZED 05/16/11 20:55:54
    LOGGING YES
    MAX_EXTENTS 2 147 483 645
    MAX_TRANS 255
    MIN_EXTENTS 1
    MONITORING NO
    NESTED NO
    NEXT_EXTENT
    NUM_FREELIST_BLOCKS 0
    NUM_ROWS 137 122 804
    OBJECT_ID_TYPE
    OWNER RXC
    PARTITIONED NO
    PCT_FREE 10
    PCT_INCREASE
    PCT_USED
    ROW_MOVEMENT DISABLED
    SAMPLE_SIZE 34 280 701
    SECONDARY N
    SKIP_CORRUPT DISABLED
    TABLESPACE_NAME RXC_RESP_TSPA
    TABLE_LOCK ENABLED
    TABLE_NAME RESPONSES
    TABLE_TYPE
    TABLE_TYPE_OWNER
    TEMPORARY N
    USER_STATS NO


    Citation Envoyé par mnitu
    Le filtre sur la table c (date = 15-08-3051) utilise une date bidon pour remplacer un null et a pour conséquence d’introduire une non-uniformité des données très forte. Sans histogrammes sur cette colonne l’optimiseur part tranquillement dans les choux.
    Salut, malheureusement, la date n'est pas bidon. Je travaille sur le système Oracle Clinical, qui utilise une base Oracle. Oracle Clinical a besoin de conserver toute donnée saisie dans le système. Pour cela, il utilise une date de fin de validité (end_ts) qui est fixée à une date future (15AUG3051) pour indiquer au système que c'est la valeur courante. Grace à ce fonctionnement, on est capable de sortir toutes les données saisies dans une fourchette de temps donnée. Je vais pas m'étendre dur le sujet, il faut considérer qu'il y a une véritable utilité à ce fonctionnement (domaine de la recherche clinique, donc fort besoin en audit etc)


    Citation Envoyé par mnitu
    Bref, je n’ai pas vu de version de base Oracle mais je pense que c’est une base Oracle 9. Il est très probable que recalculer les statistiques avec génération des histogrammes là où besoin est devrait améliorer les choses.
    Effectivement, je confirme, c'est une base Oracle 9i. On devrait bientôt passer en 11, mais en attendant, faut bien s'occuper

  14. #14
    Membre expérimenté 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 : 50
    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
    Points : 1 597
    Points
    1 597
    Par défaut
    ok, on la refait doucement

    Pour obtenir les statistiques sur les tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * 
    from dba_tables 
    where table_name in ('MA_TABLE_A','MA_TABLE_B','MA_TABLE_C' );
    Pour obtenir les statistiques sur les index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select * 
    from dba_indexes 
    where table_name in ('MA_TABLE_A','MA_TABLE_B','MA_TABLE_C' )
    order by table_name ;

    Pour obtenir les obtenir les statistiques sur les colonnes impactées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select * 
    from dba_tab_columns
    where table_name in ('MA_TABLE_A','MA_TABLE_B','MA_TABLE_C' )
    and column_name in ('ID','END_TS','VAR_01','SUB_ID','COLLECTED_DATA')
    order by table_name ;
    Pour obtenir les obtenir les histogrammes sur les colonnes impactées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select * 
    from dba_tab_histograms
    where table_name in ('MA_TABLE_A','MA_TABLE_B','MA_TABLE_C' )
    and column_name in ('ID','END_TS','VAR_01','SUB_ID','COLLECTED_DATA')
    order by table_name ;

  15. #15
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par mnitu Voir le message
    ...Le filtre sur la table c (date = 15-08-3051) utilise une date bidon pour remplacer un null et a pour conséquence d’introduire une non-uniformité des données très forte. Sans histogrammes sur cette colonne l’optimiseur part tranquillement dans les choux.
    ...
    Je viens de reformuler:
    Le filtre sur la table c (date = 15-08-3051) utilise une date dans le futur pour remplacer un null et a pour conséquence d’introduire une non-uniformité des données très forte. Sans histogrammes sur cette colonne l’optimiseur part tranquillement dans les choux.

    Voilà, maintenant relisez.

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/06/2006, 17h00
  2. Problème affichage form avec Internet Explorer dans un menu
    Par dupard2006 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 28/03/2006, 19h26
  3. Réponses: 8
    Dernier message: 11/02/2006, 23h36
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39

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