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 :

Question techniques sur les extents


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 126
    Points : 49
    Points
    49
    Par défaut Question techniques sur les extents
    Bonjour à tous,
    j'ai une questions au sujet des extents, je vais essayer de prendre un exemple simple.
    Admettons que je crée une table clients. Oracle va donc créer 1 segment et dans ce segment se trouvera un extent de 256K (32blocs contigus).

    J'entre des données, Oracle va les écrire dans les 30 premiers blocs de l'extent. Maintenant je supprime des données, donc je supprime les données à l'interieur des blocs. Par exemple, il n'y'aura plus rien dans le bloc 10,16,18 et 24. OK?

    Maintenant j'insere de nouvelles données, est ce que Oracle va remplir à partir du bloc 31 ou utiliser les blocs juste avant libérer?

    Ma question peut se résumer en fait en une phrase:
    Est ce qu'il y a de la fragmentation à l'interieur des extents?




    Merci à tous ceux qui répondront.

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    Oui les blocks libres vont être réutilisés. Il peut y avoir de la fragmentation à l'intérieur d'un segment. Les blocs libres sont recensés dans les FREELIST.

    Quand tu fais des inserts dans un bloc, ce bloc est retiré de la freelist dès que l'espace libre descend en dessous de PCTFREE %de la taille du bloc. L'espace restant est réservé pour les futures updates.

    Quand tu fais des deletes dans un bloc, ce bloc est replacé dans la freelist dès que le pourcentage d'utilisation de ce bloc descend en dessous de PCTUSED % de la taille du bloc. Le bloc n'a pas besoin d'être entièrement vide de ligne pour pouvoir être réutilisé.

    Quand tu va faire un insert, Oracle va chercher dans sa/ses freelists pour trouver un bloc libre et y faire l'insert.

    Par contre si tu fais un insert /*+ append */ Oracle n'utilise pas de freelist et ajoute un bloc directement à la fin de la table (high water mark). Dans ce cas, l'espace libre n'est pas réutilisé.

    De la même manière il peut y avoir de la fragmentation à l'intérieur d'un block : est-ce-que quelqu'un sait si Oracle défragmente les blocs, j'ai jamais entendu parler de ca ?

    Voili, voilou,

    Laly.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    si tu veux defragmenter les blocs, il faut reconstruire la table (ce qui defragmentera tout d'ailleurs

    Par contre il existe aussi une autre sotre de fragmentation pour les blocs dans l'autre sens: le chainage.

    dans ce vas, on s'en tire en faisant migrer les lignes chainées dans une table temporaire puis en les réintegrant dans la table cible.

    Mais je crois qu'on s"éloigne un peut du sujet de départ

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    un peu, mais cela fait du bien de faire le tour ! 8)

  5. #5
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Je me pose une question concernant la fragmentation intra-block.

    Oracle conserve dans ses freelists si un bloc est libre ou pas, mais pas quelle est la taille de la plus grande ligne insérable.

    Que se passe t'il si on souhaite insérer une ligne dans un bloc où il y a de la place mais pas assez de place contigue pour recevoir la ligne, il y a un chainage intra-block ? Ou bien Oracle parcourt les blocs libres de la freelists un par un jusqu'à trouver un bloc qui puisse accepter la ligne ?

    Je me pose de ces questions desfois


    Laly.

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Voudrais par dire de bétise, mais je pense que le chaînage intervient surtout sur un UPDATE.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    bah j'voudrais pas dire de bêtise mais il me semble qu'Oracle insert les lignes systématiquement à la fin pour éviter le chainage et ne rempli les "trous" que lors d'update et c'est là que le chainage intervient... sauf qu'évidemment il y a quand même du chainage possible si la ligne inséré et plus grosse que le bloc (pour un LOB par exemple) mais là c'est pas très grave et surtout peut pas y faire grand chose

  8. #8
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    C'est à peu près ca :

    Il y a bien de la défragmentation à l'intérieur d'un bloc :
    Released space may or may not be contiguous with the main area of free space in a data block. Oracle coalesces the free space of a data block only when (1) an INSERT or UPDATE statement attempts to use a block that contains enough free space to contain a new row piece, and (2) the free space is fragmented so the row piece cannot be inserted in a contiguous section of the block. Oracle does this compression only in such situations, because otherwise the performance of a database system decreases due to the continuous compression of the free space in data blocks.
    Donc Oracle ne parcourt pas les blocs de la freelists pour trouver un espace contigu assez grand pour contenir une nouvelle ligne, il défragmente un bloc où il y a assez d'espace libre.


    Laly.

    http://download-west.oracle.com/docs...block.htm#2595

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Ok donc pour résumer,
    Oracle gère une liste de blocs qui ont de l'espace libre (seuil en dessus du pctfree). Une fois qu'il en a trouvé un, il le défragemente afin que les données d'une même ligne se trouve de manière contigue.

    Is it right?

  10. #10
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Pour être plus précis :
    - un bloc est placé sur la freelist quand le % d'espace libre tombe en dessous de PCTFREE
    - un bloc est retiré de la freelist quand le % d'espace utilisé tombe en dessous de PCTUSED

    Quand on souhaite faire un INSERT, Oracle parcourt la freelist jusqu'à trouver un bloc susceptible d'accueillir la nouvelle ligne. Si l'espace est contigu, pas de pb, l'insertion se fait. Sinon, Oracle défragmente le bloc avant de faire l'insertion.

    De même pour un UPDATE, si le bloc de la ligne contient assez de place, l'update se fait; sinon Oracle défragmente au préalable ce bloc.
    Si la ligne après update est plus grande que l'espace libre du bloc, la ligne sera chainée.


    Laly.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Et dans le cas où il y ai plusieurs entents. Si après un gros delete, il y a pleins de blocs de libre dans l'extent 1, est-ce que Oracle va continuer à utiliser les blocs libre dans l'extent2 ou est-il capable de parcourir avec les blocs libre de l'extent1?

    LA freelist gère tous les blocs du segment ou y'a t'il une freelist par extent?

  12. #12
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    LA freelist gère tous les blocs du segment
    Mais pour un même segment tu peux avoir plusieurs freelists. C'est utile pour une table dans laquelle il y a bcp d'insert simultanés/parallèles. Dans ce cas, l'unique freelist devient un point de contention.

    On peut augmenter/diminuer le nombre de freelists :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table ... storage ( freelists N)
    Avec l'ASSM sous Oracle 9i, c'est Oracle qui gère l'espace libre pour nous (Cf. http://asktom.oracle.com/pls/ask/f?p...D:968929996025)


    Laly.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Ok, merci pour ces dernières précisions, je clos le message en vous remerciant tous.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour a tous,

    bon, je vais surement me faire massacrer par un moderateur car j'aurais certes mieux fait de lancer un nouveau sujet, mais ayant recherche les sujets relatifs aux blocks et freelists, je me dis au final, pourquoi ne pas continuer sur celui ci ........

    Voila en fait ma question:

    Y a t'il une maniere de connaitres les blocks inutilises, pas seulement ceux qui repondent au critere d'eligibilite des freelists??

    bref, en d'autre termes, y'a t'il dans le header d'un block une sorte de flag disant qu'il n'est pas utlise, et si oui, de quelle maniere le savoir??

    en vous remerciant d'avance,

    Jpouil

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par aline
    Par contre il existe aussi une autre sotre de fragmentation pour les blocs dans l'autre sens: le chainage.
    le chaînage est "normal", c'est la migration qui est génante quand il y en a trop. Le chaînage c'est simplement une ligne qui ne tient pas dans un bloc, la migration c'est une ligne qui a été déplacé dans un nouveau bloc (à cause d'un update plus important que l'espace laissé par PCTFREE) et alors Oracle va dans le bloc original pour trouver la référence au bloc où la ligne est migrée sachant qu'elle peut avoir migré plusieurs fois.

    Attention aussi aux DELETE qui s'il libère les blocs ne fait pas descendre la High Water Mark ce qui peut dégrader les perfs inutilement

  16. #16
    j6m
    j6m est déconnecté
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Points : 84
    Points
    84
    Par défaut qui le fait
    ces informations ne sont-elles pas vérifiables

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075

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

Discussions similaires

  1. Petites questions techniques sur les XML de géolocalisation
    Par alex77722 dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 09/08/2012, 16h44
  2. Petites questions techniques sur les XML
    Par alex77722 dans le forum IGN API Géoportail
    Réponses: 1
    Dernier message: 03/08/2012, 18h25
  3. petite question sur les extentions
    Par sossomj dans le forum C++Builder
    Réponses: 3
    Dernier message: 09/06/2008, 00h16
  4. Réponses: 7
    Dernier message: 02/01/2008, 14h32
  5. Question technique sur les listes déroulantes
    Par kenny49 dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2007, 10h41

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