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 PostgreSQL Discussion :

Maintenance de table


Sujet :

Administration PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut Maintenance de table
    Bonjour,


    Je me posais des questions concernant la maintenance des tables d'une base pgsql.


    Et plus en particulier sur les manières de gérer l'espace / la ré-organisation des tables / index.


    Prenons une table avec 3.000.000 de lignes assez simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create table t_telephone_tel (
    cli_id references t_client_cli (cli_id),
    ttl_id references t_tel_type_ttl (ttl_id),
    tel_num varchar(10),
    primary key (cli_id, ttl_id));
     
     
    CREATE INDEX idx_tel_1
      ON t_telephone_tel
      USING btree
      (tel_num COLLATE pg_catalog."default" varchar_pattern_ops, cli_id );

    Mon test est le suivant :
    Suppression de 300.000 lignes
    vacuum analyze de la table.

    Insertion de 300.000 lignes =>
    la table n'a pas grossis => les lignes supprimées ont été réutilisées.
    Mon index idx_tel_1 n'a pas grossis (j'en déduis qu'il a bien été ré-indéxé ?)
    Par contre la taille de ma primary key a presque doublée 64Mo=> 101Mo !


    Comment celà ce fait ?
    Quelle possibilité ai-je à ce stade là ? Ré-org mes tables selon un cluster ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cluster ma_table using ma_pk
    Merci.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    La commande CLUSTER réécrirait la table dans l'ordre de l'index, mais pas l'index lui-même.
    Pour remettre l'index de la clef primaire à sa taille minimale (=supprimer les trous) il faudrait faudrait lancer un REINDEX dessus.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    pourtant le fait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CLUSTER ma_table using ma_pk;
    ré-org bien mon index sur la pk, il passe de 101Mo à 64Mo (taille initiale).


    Mais sinon ok pour le REINDEX ca marche bien aussi, merci.


    Restera le fait que je ne comprend pourquoi l'index associé à la pk grossis dans ce cas de figure alors que l'autre index lui ne bouge pas (tous les deux sont des btree pourtant)


    edit :
    Pour le cluster :
    delete de 300k lignes.
    pas de vacuum analyze.
    cluster => la table et les index sont réorganisées.

    J'en déduit qu'il fait un vacuum avant de réécrire la table + un reindex.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Etonnant car je ne vois de mention de ça dans la doc de cluster. Si ça réécrit l'index on s'attendrait à ce que ça soit mentionné, je trouve. Ou alors j'ai pas lu assez attentivement.

    Pour les index en b-tree dont l'un augmente et l'autre pas, l'explication est peut-être sur le contenu des données. En principe l'espace libre dans un b-tree a plus de chances d'être réutilisé si on insère les mêmes valeurs qu'avant. Si par contre on insère des valeurs totalement différentes (ce qui est le cas avec les clefs auto-incrémentées) les trous dans b-tree ont plus de chances de rester tels quels. Mais c'est juste une théorie je ne sais pas ce qu'elle vaut dans le cas présent.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Contrairement à Oracle ou MS SQL Server, la maintenance par VACUUM ne défragmente pas physiquement les données. C'est pourquoi il y a toujours une fragmentation résiduelle des tables.
    Pour en avoir le cœur net, il suffit de recréer la table sous un autre nom et ajouter les données dedans, puis mesurer le volume de la table.
    Cela fait partit des points négatifs de PostGreSQL....
    Comme je l'indiquais dans ce post : http://www.developpez.net/forums/d11...s/#post6302371
    A la suite de cet article : http://www.developpez.net/forums/d11...resql-ecueils/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    En effet VACUUM ne défragmente pas, puisque c'est le rôle d'autres commandes que sont VACUUM FULL ou CLUSTER.

    C'est sûr que si on se trompe de commande on n'obtient pas le résultat escompté, que ce soit sous postgresql ou n'importe quel autre SGBD.

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

Discussions similaires

  1. Réparation table/entête endommagée
    Par tbesrour dans le forum Paradox
    Réponses: 15
    Dernier message: 27/11/2007, 10h42
  2. Tables MDA et maintenance
    Par arona dans le forum Sybase
    Réponses: 3
    Dernier message: 26/01/2007, 12h06
  3. Maintenance tables, prog, ..ETC
    Par DI DODO dans le forum Access
    Réponses: 19
    Dernier message: 27/03/2006, 16h30
  4. Newbie......compilateur et table de caractères
    Par Cyberf dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 21/08/2002, 14h29
  5. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31

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