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

Oracle Discussion :

20 secondes pour lire une table vide ?!


Sujet :

Oracle

  1. #1
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut 20 secondes pour lire une table vide ?!
    Bonjour.

    J'ai une base 10G sur 2003Server R2.
    Dans ma base, j'avais une table contenant 26 millions de lignes.
    A travers une application, dont je n'ai pas les sources, j'ai effectué une purge sur cette table.
    Elle est bien vide mais quand je tape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select* from card_move_history;
    j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aucune ligne sÚlectionnÚe
     
    EcoulÚ : 00 :00 :20.89
    J'ai poussé un peu plus loin et voila ce que j'obtiens
    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
    SQL> select * from table (dbms_xplan.display);
     
    PLAN_TABLE_OUTPUT
    ----------------------------------------------------------------------------------
     
    -----------------------------------------------------------------------
    | Id  | Operation         | Name              | Rows  | Bytes | Cost  |
    -----------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                   |    26M|  1641M| 57535 |
    |   1 |  TABLE ACCESS FULL| CARD_MOVE_HISTORY |    26M|  1641M| 57535 |
    -----------------------------------------------------------------------
     
    Note
    -----
       - 'PLAN_TABLE' is old version
     
    11 ligne(s) sÚlectionnÚe(s).
     
    EcoulÚ : 00 :00 :00.06
    Pourquoi considère-t-il qu'il y a 26M de lignes?

  2. #2
    Membre actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Points : 275
    Points
    275
    Par défaut
    Hello,

    Serait-ce des données d'indexation ou bien un système de cache de tes tuples supprimés ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function googleIsYourF*ck*ngFriend(String url, String maQuestion){
        goTo(url);
        reponse = find(maQuestion);
        if(isAcceptable(reponse)){
            clickOn(By.xpath("//button[@id='resolvedButton']"));
        }
        sendMessage("Merci");
    }
    
    googleIsYourF*ck*ingFriend("http://www.google.fr", "ma question");

  3. #3
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    ce sont des données, pas des indexes (si j'ai bien compris la question).

    Qu'entendez-vous pas système de cache?

  4. #4
    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 olivier] Voir le message
    ----------------------------------------------------------------------------------
    Pourquoi considère-t-il qu'il y a 26M de lignes?
    Parce que les statistiques de la table ne sont pas à jour.

  5. #5
    Membre actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Points : 275
    Points
    275
    Par défaut
    Est-ce que les données ont été indexées ou mise en cache dans le SGBD ?
    Si oui, est-ce qu'un simple purge supprime à la fois les données de la base, les indexes pointant sur ces données et la mise en cache des données (vulgairement, le cache sert à optimiser les requêtes en conservant "en mémoire" les données les plus souvent utilisées lors des requêtes, ainsi cela évite au SGBD d'avoir à fouiller à nouveau dans la foultitude de tuples pour obtenir ces données régulièrement demandé).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function googleIsYourF*ck*ngFriend(String url, String maQuestion){
        goTo(url);
        reponse = find(maQuestion);
        if(isAcceptable(reponse)){
            clickOn(By.xpath("//button[@id='resolvedButton']"));
        }
        sendMessage("Merci");
    }
    
    googleIsYourF*ck*ingFriend("http://www.google.fr", "ma question");

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Les stats ne sont pas à jour, donc l'optimiseur considère qu'il y a toujours 26M de lignes.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    zaza576 : apparemment, il n'y a aucun index sur la table si j'en crois ALL_INDEXES.

    mnitu et McM : Donc je ne verrai l'effet de ma suppression que demain? (apparemment il y a une analyse stats tous les soirs).
    Je connais un peu les stats mais je pensais qu'en accès simple (sans croisement) l'impact de la suppression serait immédiat...

  8. #8
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    Merci beaucoup.

  9. #9
    Membre actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par olivier] Voir le message
    zaza576 : apparemment, il n'y a aucun index sur la table si j'en crois ALL_INDEXES.

    mnitu et McM : Donc je ne verrai l'effet de ma suppression que demain? (apparemment il y a une analyse stats tous les soirs).
    Je connais un peu les stats mais je pensais qu'en accès simple (sans croisement) l'impact de la suppression serait immédiat...
    As-tu accès à l'exécution des jobs sur les stats ? Tu pourrais le forcer à le faire maintenant pour mettre à jour des actions sur la base et faire disparaître ces 26 Mo.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function googleIsYourF*ck*ngFriend(String url, String maQuestion){
        goTo(url);
        reponse = find(maQuestion);
        if(isAcceptable(reponse)){
            clickOn(By.xpath("//button[@id='resolvedButton']"));
        }
        sendMessage("Merci");
    }
    
    googleIsYourF*ck*ingFriend("http://www.google.fr", "ma question");

  10. #10
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Il y a fort à parier que la table ait été vidée par des DELETE, avec la conséquence classique que le marqueur "high water mark" n'est pas mis à niveau.
    Lors d'un parcours complet d'une table (le fameux TABLE ACCESS FULL de votre plan d'exécution), tous les blocs de la table sont lus jusqu'au marqueur, car pour Oracle, ils sont susceptibles de contenir des données.

    C'est facile à voir.
    Dans SQL*Plus, faites un SET AUTOTRACE ON, et réexécutez votre SELECT.

    Dans la partie "statistiques", vous verrez le nombre de blocs lus (db block gets et consistent gets).

    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
    20
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |   207 |   300   (0)| 00:00:04 |
    |   1 |  TABLE ACCESS FULL| DEMO |     1 |   207 |   300   (0)| 00:00:04 |
    --------------------------------------------------------------------------
    
    Statistiques
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           1079  consistent gets
              0  physical reads
              0  redo size
           1351  bytes sent via SQL*Net to client
            508  bytes received via SQL*Net from client
              1  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              0  rows processed
    Le fait que les statistiques ne soient pas à jour n'est pas ici ce qui cause le problème de performances.
    Celui-ci, même avec des statistiques à jour, persistera tant que le marqueur n'aura pas été redescendu.
    Pour cela, vous pouvez, par exemple, utiliser la commande TRUNCATE.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  11. #11
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    Désolé zaza576, je n'ai pas vu ta question avant ce matin.
    Mais les stats n'ont rien changé et pomalaix a raison
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SQL> select * from card_move_history;
    
    aucune ligne sÚlectionnÚe
    
    EcoulÚ : 00 :00 :20.67
    
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 425611253
    
    ---------------------------------------------------------------------------------------
    | Id  | Operation         | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                   |     1 |   122 | 56702   (1)| 00:11:21 |
    |   1 |  TABLE ACCESS FULL| CARD_MOVE_HISTORY |     1 |   122 | 56702   (1)| 00:11:21 |
    ---------------------------------------------------------------------------------------
    
    
    Statistiques
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
         257695  consistent gets
         255171  physical reads
              0  redo size
            869  bytes sent via SQL*Net to client
            385  bytes received via SQL*Net from client
              1  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              0  rows processed
    Question subsidiaire :
    J'ai constaté ce problème en test. Mais en prod la tables est a 26 M et je vais devoir réduire le nombre sans tout supprimer. Je n'aurai donc aucun moyen de ramener le HWM à une valeur "décente" puisqu'il faut passer par un truncate.
    Me trompe-je?

  12. #12
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par olivier] Voir le message
    ... je vais devoir réduire le nombre sans tout supprimer. Je n'aurai donc aucun moyen de ramener le HWM à une valeur "décente" puisqu'il faut passer par un truncate.
    TRUNCATE est une des opérations qui réajustent le HWM, pas la seule.

    Dans votre cas, ALTER TABLE matable SHRINK SPACE est la solution pertinente.
    Voir par exemple : http://blog.developpez.com/pachot/shrink_table/ et n'hésitez pas à cliquer sur sa démo.

    Une telle réorganisation se justifie si vous supprimez une proportion notable des données, et que vous n'allez pas, dans l'immédiat, réinsérer autant de données.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  13. #13
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Suivant les versions (je ne connaissais pas le Shrink Space, merci Pomalaix), on peut aussi faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table move tablespace <même tablespace>
    Le truncate peut ne pas être utilisé tout le temps en cas de contrainte référentielle.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  14. #14
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    Génial, ça fonctionne.
    Lien hyper instructif mais pfiouuu... je vais devoir m'y reprendre à plusieurs fois pour bien comprendre toutes les explications de la démo.

    Merci.

  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 olivier] Voir le message
    ...
    Mais les stats n'ont rien changé et pomalaix a raison
    ...
    Il y des statistique (concernant la table, les indexes, etc) et des statistiques (d'exécution de la requête)!
    Ceux de la table on bien changés: regardez la valeur Rows actuelle 1 et comparez la avec la valeur de votre première intervention 26M.
    En ce qu'il concerne les statistiques d'exécution vous avez maintenant les informations vous permettant de comprendre pourquoi elle restent encore assez importantes.

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par McM Voir le message
    On peut aussi faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table <matable> move tablespace <même tablespace>
    À ce moment-là autant écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table <matable> move;

  17. #17
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    Effectivement mnitu, je n'avais pas vu ce changement.

    Pour autant le temps de réponse restait à 20 secondes. C'est ce qui me faisait dire que les stats n'avaient rien changé.

  18. #18
    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
    Sur la table ayant 26M lignes combien estimez-vous qu'il resteront suite à la purge ?

  19. #19
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    A priori, il devrait en rester un peu moins d'un tiers.
    Il faut en supprimer un peu plus de 19 M soit 72% environ.

  20. #20
    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 olivier] Voir le message
    A priori, il devrait en rester un peu moins d'un tiers.
    Il faut en supprimer un peu plus de 19 M soit 72% environ.
    Dans ce cas il sera mieux de créer une nouvelle table (create ... as Select ...) qui contiendra que ce qui reste sans les souci de fragmentations et High Water Marck impliqués par le delete, de détruire l'ancienne table (drop table) et de renommer la nouvelle en table d'origine. Et bien sur s'occuper de tous les autres choses dépendantes:constraintes, indexes, triggers, etc.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AJAX] Appel ajax pour lire une table Mysql
    Par theo17 dans le forum jQuery
    Réponses: 32
    Dernier message: 26/02/2013, 15h44
  2. Réponses: 4
    Dernier message: 22/07/2010, 00h40
  3. Quelle composant pour lire une table sous BTrieve 6
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/02/2010, 17h19
  4. Retourner une colonne même pour une table vide
    Par The eye dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/03/2008, 18h58
  5. Recordset pour INSERT INTO dans une table vide
    Par tAKAmAkA dans le forum VBA Access
    Réponses: 12
    Dernier message: 09/02/2007, 20h52

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