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

Administration Oracle Discussion :

Dimensionnement d'une table sous 10G


Sujet :

Administration Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Dimensionnement d'une table sous 10G
    Bonjour à tous,

    Je rencontre quelques difficultés pour sizer une table de ma base Oracle (plus précisement la taille qu'utilise certaines lignes de ma table dans mon tablespace)
    J'ai utilisé une requête assez basique trouvée sur le net mais je trouve un delta assez important entre les informations que j'ai calculé et la volumétrie donné par TOAD. Ces calculs me sont utiles pour prévoir le remplissage d'une table. Je précise également

    - que c'est une table partitionnée par valeur.
    - que ma table est consistué de 2 champs : un INT construit par séquence + 1 BLOB qui est toujours vide (NULL).
    - la table est en row movement enable.

    Voici mon raisonnement :

    1°) Je récupère le nom et le type de toutes les colonnes de ma table

    select column_name,data_type
    from all_tab_columns where table_name='employees';

    2°) je calcule la taille de ma table (un type INT et un BLOB) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
    3 + avg(
                   nvl(vsize(ID_FIELD),0)+1 +
                   nvl(dbms_lob.getlength(BUFFER_FIELD),0)+1 
    ) "Total bytes per row"
    from employees;
    100 bytes

    3°) J'ajoute la taille de l'index de mon clé primaire ID_FIELD (stockage dans mon tablespace)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select sum(COLUMN_LENGTH)
       from dba_ind_columns
      where  TABLE_NAME = 'employees';
    22 bytes


    4°) Je fait la somme :

    100 + 22 = 122 Bytes per row (en moyenne)

    Quand je multiplie cette moyenne a mon nombre de lignes, je trouve 2,56 Mb.
    Quand je regarde dans TOAD et j'additionne les extents utilisés sur les partitions de ma table , je me retrouve avec 3,88 Mb soit 34% de plus que le résultat de mon calcul.

    5°) A quoi est-due cette différence? est-ce la bonne méthode pour procédé à ce type de monitoring ?

    J'ai lu pas mal de doc concernant l'organisation des données dans les block oracle et me suis orienté pour comprendre vers le PCTFREE et PCTUSED (respectivement 10 et 0 dans mon cas).
    Est-ce qu'un PCTUSED a 0 (qui augmente donc l'espace inutilisé en cas de delete/update de ma table) peut être à l'origine de cette différence?
    J'ai également vérifié du coté de mon BLOB (mais il est toujours vide), il est en enable storage in row, mais vu qu'il est vide pour moi il est stocké dans la table et donc pas de soucis de ce coté la normalement.

    Si vous avez quelques pistes ou idées sur l'origine de cette espace utilisé ?

  2. #2
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Le fait que j'ai un PCTFREE à 10 signifie que je conserve 10% de chaque block (dans mon cas 8 ko ) .

    Ca ferait donc 10% de 8 Ko gaspillé par block.

    Ca doit être ce qui me manque...

    Je veux quand même bien vos avis sur la façon de monitorer le remplissage d'une table. J'ai lu qu'on pouvais utiliser certaines vue pour voir la vitesse de remplissage d'une table mais ça m'a l'air compliqué!

  3. #3
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    En général pour calculer le taille moyenne d'une ligne dans un table non partitionnée sans LOB, il faut récupérer la taille du segment dans DBA_SEGMENTS et diviser par le nombre de lignes de la table: ceci prend en compte les blocs éventuellement alloués mais vides. Pour une table partitionnée, il suffit d'additionner la taille de tous les segments de la table (1 partition = 1 segment). S'il y a des LOBs il faut prendre en compte les segments internes créés pour la colonne CLOB (voir la vue DBA_LOBS).


    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
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
    PL/SQL Release 10.2.0.4.0 - Production
    CORE    10.2.0.4.0      Production
    TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
    NLSRTL Version 10.2.0.4.0 - Production
     
    SQL>
    SQL> drop table t;
     
    Table dropped.
     
    SQL> purge recyclebin;
     
    Recyclebin purged.
     
    SQL> select * from user_segments;
     
    no rows selected
     
    SQL>
    SQL> create table t(x int, y clob) lob (y) store as (enable storage in row);
     
    Table created.
     
    SQL>
    SQL> colum segment_name format a40
    SQL> select segment_name, bytes from user_segments;
     
    SEGMENT_NAME                                  BYTES
    ---------------------------------------- ----------
    SYS_IL0000011742C00002$$                      65536
    T                                             65536
    SYS_LOB0000011742C00002$$                     65536
     
    SQL>
    SQL> exit

    Pour connaître l'utilisation de l'espace des blocs dans un segment, il faut utiliser DBMS_SPACE.SPACE_USED qui ne donne que des chiffres globaux.

    Notez qu'un index est toujours dans un segment distinct de celui de la table (sauf cas particulier de l'IOT).

Discussions similaires

  1. Exporter le contenu d'une table sous forme d'un script SQL
    Par Invité dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 14/09/2005, 10h08
  2. Tester l'existence d'une table sous Access
    Par Oluha dans le forum Bases de données
    Réponses: 10
    Dernier message: 29/08/2005, 09h42
  3. Comment inserer une image dans une table sous sql qerveur
    Par zeddy23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/02/2005, 08h51
  4. tableau dynamique via une table sous sql server
    Par bibi2607 dans le forum ASP
    Réponses: 5
    Dernier message: 21/02/2005, 15h45
  5. MAJ d'une table sous SQL Server par insertion
    Par keish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/06/2003, 16h23

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