Skip site navigation (1) Skip section navigation (2)

Rép. : Re: Tables archivées

From: "Erwan DUROSELLE" <EDuroselle(at)seafrance(dot)fr>
To: <jean-paul(at)argudo(dot)org>, <sdupuy(at)hducros(dot)fr>
Cc: <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Rép. : Re: Tables archivées
Date: 2005-01-04 12:56:06
Message-ID: f58e42a3d25df80cf5e5052ef09c71ac41da9276@ (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Il n'y a pas dans PostgreSQL de méthode aussi aboutie que la partition d'Oracle pour faire ce que tu veux.

On peut néanmoins utiliser les vues, comme le propose Jean Paul

Une autre option est d'utiliser l'héritage.
cf http://archives.postgresql.org/pgsql-performance/2004-09/msg00135.php
ou http://archives.postgresql.org/pgsql-performance/2004-12/msg00101.php

Dans les 2 cas, avec PostgreSQL v8.0, tu peux utiliser les tablespaces pour séparer les données et les index sur différents disques et parralléliser les I/O.


J'ai une autre piste, un peu différente: Garder une grosse table, mais utiliser des index partiels (sur l'année en cours).
Voir http://traduc.postgresqlfr.org/pgsql-fr/indexes-partial.html
- C'est très simple à mettre en place: tu rajoutes une clause where à la création de chaque index. C'est tout.
- Toutes tes données sont toujours accessibles, mais les données qui ne portent pas sur l'année en cours font un "table scan".
- Les index utilisés sont moins gros dont un peu plus rapides.
- Tu économises la place des index sur les années passées.
- Tu peux toujours rajouter un index "complet" sur un champ donné, si tu as un besoin précis.

Aucune des 3 solutions n'est parfaite. 
Si tu fais des essais, donne nous les résultats, ce sera intéressant.

Erwan

>>> Jean-Paul ARGUDO <jean-paul(at)argudo(dot)org> 04/01/2005 12:14:38 >>>
> j'ai une table "expéditions" qui grossit de jour en jour et que je
> souhaiterais "archiver", chaque année, pour limiter la taille de la base en
> conservant, par exemple, tous les index sur l'année courante et l'année
> passée, et n'avoir qu'un seul index de recherche sur les années
> antérieures. J'aurais ainsi des tables "exped2005", "exped2004",
> "exped2003"... 

Solution basée sur une vue (il doit y en avoir des plus futées, pas trop le 
temps de chercher):

Créer une table par an:

create table exped2003 as
select * 
from expeditions
where expedition_date between to_date('01/01/2003','DD/MM/YYYY')
and to_date('31/12/2003','DD/MM/YYYY');

optionnel : create index (qui va bien sur la table ci-dessus...);

idem pour années suivantes: s/2003/2004/g ...

Créer une vue pour une sélection sur toutes les tables:

create vue expeditions_toutes
as 
select * from exped2003
union
select * from exped2004
union
...;

Requêter sur la vue expeditions_toutes qui aggrège par un UNION les données de 
doutes les tables. (cf UNION ALL si doublons possibles et qu'on veut les 
garder)

--
Jean-Paul Argudo

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faqs/FAQ.html


Responses

pgsql-fr-generale by date

Next:From: Valérie SCHNEIDERDate: 2005-01-04 13:58:34
Subject: Re: Rép. : Re: Tables
Previous:From: Sebastien MALLERETDate: 2005-01-04 12:35:59
Subject: Re: Bonne Année 2005!

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group