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 :

[Allocation] Détermination de l'occupation d'un tablespace


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Par défaut [Allocation] Détermination de l'occupation d'un tablespace
    Bonjour à tous,

    Je désire estimer le pourcentage d'espace occupé d'un tablespace en ignorant celui occupé par les lignes supprimées...

    J'ai mis au point une 1ère requête SQL
    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
     
    SELECT   RTRIM (LTRIM (t.tablespace_name, 'TAB_FILTRE_'), '_L') TABLESPACE,
             ROUND (  (MAX (d.BYTES) / 1024 / 1024)
                    - (SUM (DECODE (f.BYTES, NULL, 0, f.BYTES)) / 1024 / 1024),
                    2
                   ) used_mb,
             ROUND (SUM (DECODE (f.BYTES, NULL, 0, f.BYTES)) / 1024 / 1024,
                    2
                   ) free_mb
        FROM dba_free_space f, dba_data_files d, dba_tablespaces t
       WHERE t.tablespace_name = d.tablespace_name
         AND f.tablespace_name(+) = d.tablespace_name
         AND f.file_id(+) = d.file_id
         AND t.tablespace_name LIKE 'TAB_FILTRE%'
    GROUP BY t.tablespace_name
    ORDER BY 1, 3 DESC
    Malheureusement, cette requête ne tient pas compte de l'espace libéré par les lignes supprimées par une commande DELETE.

    Existe-t-il une table système ou toute autre solution (SQL j'entends) pour affiner ce résultat ?

    Par avance merci de votre aide ou remarque

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    On peut avoir des infos plus détaillées avec DBMS_SPACE.FREE_BLOCKS
    et DBMS_SPACE.UNUSED_SPACE mais je ne crois pas qu'il est possible de calculer exactement l'espace libre dans chaque bloc utilisé par un segment donné lorsque le bloc est en partie utilisé.

    Voir la discussion suivante en anglais sur http://asktom.oracle.com/pls/ask/f?p...A:231414051079

  3. #3
    Membre confirmé
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Par défaut
    Citation Envoyé par pifor
    Voir la discussion suivante en anglais sur http://asktom.oracle.com/pls/ask/f?p...A:231414051079
    Merci et encore merci pifor pour ce lien très instructif !!!

    Il est vrai qu'il n'est possible d'obtenir une information très précise de l'occupation dans les blocs.
    Par contre, ce lien m'a permis de connaitre la fonction dbms_space.space_usage

    Elle permet de connaitre :
    • Le nombre de blocs pleins
    • Le nombre de blocs entre 0% et 25% libre
    • Le nombre de blocs entre 25% et 50% libre
    • Le nombre de blocs entre 50% et 75%
    • Le nombre de blocs entre 75% et 100%
    • Le nombre de blocs libres


    Il y a une contrainte à cette usage : le ou les tablespaces sur lequels s'appuie la table doit être en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLESPACE .../...
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K
    SEGMENT SPACE MANAGEMENT AUTO
    Le "LOCAL UNIFORM SIZE" me permet de connaître la taille d'un bloc...

    Fort de cette info, j'ai mis au point une fonction me permettant d'estimer rapidement (sans analyze matable et/ou select count(*) from ma table).
    Elle est inspirée du très bon lien donné par pifor
    Cela donne des résultats intéressants si
    • Le tablespace est de bonne taille (plusieurs centaine de Mo)
    • Le nombre de blocs dans le tablespace est relativement important (un peu sous-dimensionné)
    • La table est chargée de manière importante (unité minimum 100 000 de lignes)


    Ci-dessous le code de la fonction
    Je précise que ce n'est pas une fonction générique. Elle est spécifique à mon contexte :
    • La table doit être sous-partitionnée
    • Le tablespace doit être attribué à une des partitions (contenant ttes les ss-partitions)
    • Le tablespace est nommé "TAB_FILTRE%"


    Le bilan est une estimation pas du tout précise mais largement suffisante pour alerter dynamiquement sans trop demander au système...
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    drop function occupation_filtrage
    /
    drop type occupation_table_type
    /
    drop type occupation_type
    /
     
    create or replace type occupation_type
    as object
    ( equipement            varchar2(30),
      occupation            number(5,2)  
    )
    /
    create or replace type occupation_table_type
    as table of occupation_type
    /
     
    create or replace
    function occupation_filtrage
    return occupation_table_type
    authid CURRENT_USER
    PIPELINED
       as
        pragma autonomous_transaction;
        type rc is ref cursor;
        l_table rc;
        l_partition rc;
     
        l_unf       number; 
        l_unfb      number; 
        l_fs1       number; 
        l_fs1b      number; 
        l_fs2       number; 
        l_fs2b      number; 
        l_fs3       number; 
        l_fs3b      number; 
        l_fs4       number; 
        l_fs4b      number; 
        l_full      number; 
        l_fullb     number; 
     
        l_used      number;
        l_taille    number;
        l_sql                       long;
        l_data                      occupation_table_type := occupation_table_type();
     
        l_equipement        varchar2(30);
        l_table_name        varchar2(30);
        l_partition_name    varchar2(30);
        l_subpartition_name varchar2(30);
    begin
        l_sql := 'SELECT  DISTINCT RTRIM (LTRIM (t.tablespace_name, ''TAB_FILTRE_''), ''_L''),
                           s.table_name,
                           s.partition_name,v.taille
          FROM  dba_tablespaces t,all_tab_subpartitions s,
               (SELECT   t.tablespace_name,
                         SUM (DECODE (d.BYTES, NULL, 0, d.BYTES)) as taille
                FROM dba_data_files d, dba_tablespaces t
                WHERE t.tablespace_name = d.tablespace_name
                AND t.tablespace_name LIKE ''TAB_FILTRE%''
                GROUP BY t.tablespace_name) v
          WHERE s.table_owner=''DB_SPOT''
          AND s.tablespace_name=t.tablespace_name
          AND s.tablespace_name=v.tablespace_name
          AND t.tablespace_name LIKE ''TAB_FILTRE%''';
        execute immediate 'alter session set cursor_sharing=force';
        open l_table for l_sql;
        execute immediate 'alter session set cursor_sharing=exact';
     
        loop
            fetch l_table into l_equipement,l_table_name,l_partition_name,l_taille;
            exit when l_table%notfound;
            begin
              l_sql := 'SELECT subpartition_name 
                        FROM all_tab_subpartitions
                        WHERE table_owner=''DB_SPOT'' 
                        AND table_name=''' || upper(l_table_name) || '''
                        AND partition_name=''' || upper(l_partition_name) || '''';
              execute immediate 'alter session set cursor_sharing=force';
              open l_partition for l_sql;
              execute immediate 'alter session set cursor_sharing=exact';
     
              l_used :=0;
              loop
                fetch l_partition into l_subpartition_name;
                exit when l_partition%notfound;
                begin
                  dbms_space.space_usage(segment_owner      => 'DB_SPOT',
                                         segment_name       => l_table_name,
                                         partition_name     => upper(l_subpartition_name),
                                         segment_type       => 'TABLE SUBPARTITION',
                                         unformatted_blocks => l_unf,
                                         unformatted_bytes  => l_unfb,
                                         fs1_blocks => l_fs1, fs1_bytes => l_fs1b,
                                         fs2_blocks => l_fs2, fs2_bytes => l_fs2b,
                                         fs3_blocks => l_fs3, fs3_bytes => l_fs3b,
                                         fs4_blocks => l_fs4, fs4_bytes => l_fs4b,
                                         full_blocks => l_full, full_bytes => l_fullb);
     
                  l_used:= l_used + l_fullb + (0.25*l_fs4b) +(0.5*l_fs3b) + (0.75*l_fs2b) + l_fs1b;
     
     
                  exception
                    when others then null;
                  end;
              end loop;
              close l_partition;
              pipe row (occupation_type(equipement => l_equipement, occupation =>round(l_used/l_taille*100,2)));
          exception
            when others then null;
          end;
        end loop;
        close l_table;
     
        return;
    end;
    /
    Son usage est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * 
    from table( occupation_filtrage(  ) )
    Elle liste alors ttes les tables avec leur taux d'occupation pour les ss-partitions attachées au tablespace "TAB_FILTRE%"

    Si c'est pas clair, il y a une bourde... N"hésitez pas !!!

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut

  5. #5
    Membre confirmé Avatar de TheBlue
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 167
    Par défaut
    ...
    Voir la discussion suivante en anglais sur http://asktom.oracle.com/pls/ask/f?p...A:231414051079
    Malheureusement le lien ne marche plus !
    De toute façon j'y suis tombé sur le sujet en cherchant autre chose.
    Bon je

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Occupation des tablespaces
    Par orafrance dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/12/2011, 14h33
  2. occupation UNDO tablespace
    Par ducho dans le forum Administration
    Réponses: 2
    Dernier message: 12/09/2011, 16h14
  3. L'undo tablespace reste à 99% d'occupation
    Par debdba dans le forum Oracle
    Réponses: 8
    Dernier message: 19/02/2007, 15h27
  4. Réponses: 4
    Dernier message: 20/04/2006, 13h50
  5. Tablespace et allocation d'extent
    Par Doctor Z dans le forum Oracle
    Réponses: 7
    Dernier message: 09/11/2004, 09h58

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