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@
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-fr-generale by date

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