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

PostgreSQL Discussion :

Partitionnement table historique


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Points : 71
    Points
    71
    Par défaut Partitionnement table historique
    Bonjour,
    J'aimerais partitionner une table avec pour objectif d'augmenter les perfs en lecture, voici le détail :

    Table Historique(id,start_date,end_date,value,flag).

    Mon champs flag (true/false) est calculé de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (start_date < now () - 10 years) flag =true ;
    else flag = false
    J'aimerais stocker dans une autre partition les données dont start_date < now () - 10 years, donc les vieux historiques ayant flag = true

    Est-ce faisable?
    J'ai vu qu'on pouvait envoyer dans des partitions différentes via trigger insert/update/delete. J'ai compris ce principe.
    Mais comment déplacer une entrée qui était dans une partition vers une autre? (vu que l'emplacement devra évoluer dans le temps (via la date courante))

    Merci d'avance pour l'aide

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Une partition n'est pas dynamique.

    C'est un découpage physique qui répond à des règles de partitionnement précises.

    Ce que vous voulez faire correspond plus à un archivage qu'à autre chose.

    D'un point de vue général, le partitionnement sous postgresql est assez chiant à mettre en place et maintenir.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Ok c'est donc pour cela que je ne trouvais rien à ce sujet
    Selon vous,
    Un index sur le flag pourrait-il suffire à obtenir de bonnes performances de lecture ?
    Sachant que le besoin est le plus souvent de lire les données récentes et non les historiques anciens.

    je dois effectuer par exemple des requêtes du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM table WHERE flag = false
    Le fait de mettre ce filtre permettrait d'éviter de parcourir trop d'entrées dans les tables.

    J'essaie d'optimiser le tout, car il y a de nombreuses jointures à faire, avec pour chaque table des centaines de milliers de lignes.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Tout dépend des traitements et du volume traité (en Go et non en nombre de ligne)

    Rien ne vous empêche d'avoir 2 tables, 1 active et une d'historisation.

    Avec un batch qui tourne toutes les semaines, par exemple, vous transférez les lignes "anciennes" dans la table d'historisation

  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 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par vinch999 Voir le message
    Ok c'est donc pour cela que je trouvais rien à ce sujet
    ben vous avez pas bien cherché, parce que sur ce site j'ai écrit un article : http://blog.developpez.com/sqlpro/p1...paraison_postg
    qui déconseille d'ailleurs le partitionnement PG qui en sus d'être imbitable est contre performant !!!!

    Citation Envoyé par vinch999 Voir le message
    Selon vous,
    Un index sur le flag pourrait-il suffir à obtenir de bonnes performances de lecture?
    pas testé, mais il me parait strictement impossible de mettre un index sur une colonne calculée non déterministe !


    Citation Envoyé par vinch999 Voir le message
    Sachant que le besoin est le plus souvent de lire les données récentes et non les historiques anciens.
    Vous pouvez faire un index filtré qui sera réajusté tous les jours, semaines, mois, trimestre, années... par un job de PGAgent.

    Citation Envoyé par vinch999 Voir le message
    je dois effectuer par exemple des queries du style:
    SELECT * FROM table WHERE flag = false
    Cherchez pas, commencez par virer le SELECT * !

    Citation Envoyé par vinch999 Voir le message
    Le fait de mettre ce filtre permettrait d'éviter de parcourir trop d'entrées dans les tables.

    J'essaie d'optimiser le tout car il y a de nombreuses jointures à faire, avec pour chaque table des centaines de milliers de rows.
    Attention, PG n'est as un SGBDR taillé pour de nombreuses jointures sur des tables volumineuses. À partir de 12 jointures, l'optimiseur change de stratégie et la qualité d'un plan baisse notablement. Il est possible de réajuster cela en trifouillant les paramètres du GEQO et ceux du nombre d'entrées des tables de stats.

    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 émérite
    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
    Points : 2 890
    Points
    2 890
    Par défaut
    Apparemment il s'agit plutôt d'un archivage à 2 tables (récent/pas récent) que de partitionnement.

    Il suffit de faire régulièrerement un déplacement des lignes d'une table à l'autre.
    En postgres 9.1 et plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WITH lignes AS
      (DELETE FROM table_courante WHERE date_start < now() - '10 years'::interval RETURNING *) 
    INSERT INTO table_archivage SELECT * FROM lignes;
    Le champ flag serait inutile et même contre-productif.

    Pour lire des 2 tables en même temps, utiliser une vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE VIEW table_totale AS 
      select * from table_archivage
    UNION ALL
      select * from table_courante;

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2014, 10h34
  2. Réponses: 6
    Dernier message: 23/05/2008, 15h03
  3. type partitionnement tables
    Par diaxlee dans le forum Administration
    Réponses: 1
    Dernier message: 21/01/2008, 16h06
  4. Partitionnement table avec import
    Par achabane dans le forum Oracle
    Réponses: 1
    Dernier message: 11/01/2007, 17h24
  5. Réponses: 2
    Dernier message: 06/12/2006, 09h09

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