PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Partitionnement sous postgresql sans utiliser l'héritage

Technique - optimisation | Partitionnement sous postgresql sans utiliser l'héritage

Par lola le 09/05/2008 - 11:24

Bonjour à tous,
je souhaite partitionner une grosse table et diviser ainsi la table des indexes qui est devenue énorme aussi !
réindex, analyze,vacuum, vacuum full, ... da la table a permis de réduire la taille des indexes, mais ce n'est pas suffusant, d'où l'idée de partitionner la table en fonction d'un critére, exemple (refernce fournisseur!) comme ça pour chaque fournisseur, j'ai la liste des produits.
ce que je sais c'est que sous Mysql 5.1, ce probleme est bien géré, mais je souhaite resté sous postgres!

exemple sous mysql:

CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);

le critére du partitionnement est la valeur de la colonne: store_id;

la requete envoyée sur la table employees est dirigée automatiquement vers la bonne partition en fonction de la valeur de ce champs,
aucune modification est necessaire au niveau de l'appli.

y a t'il une équivalence sous postgresql ?

je vous remercie d'avance

Librement

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Non

sparky/ = 13 Mai, 2008 - 11:00

Sans l'héritage point de partition


mais, comment faire dans mon cas!

lola/ = 13 Mai, 2008 - 11:43

Bonjour,
et merci pour votre réponse, mais je ne vois pas comment faire dans mon cas, j'ai juste besoin de partitionner en utilisant une reference!
et je n'ai pas des champs communs à mettre dans la table mère et d'autres spécifiques à mettre dans chaque table fille!

ps: mon cas ressemble à l'exemple du poste precedent.

merci à celui qui veut bien m'aider à résoudre ce problème

librement


resolu

lola/ = 14 Mai, 2008 - 16:47

si ca peut aider quelqu'un d'autres:

--creation de la table mere:
CREATE TABLE sales_range
(salesman_id integer,
salesman_name text,
sales_amount integer,
sales_date timestamp);

------------------------------------------------------------
--creation des tables filles

CREATE TABLE sales_jan2008
( CHECK (sales_date < TO_DATE('02/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_fev2008
( CHECK (sales_date < TO_DATE('03/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_mar2008
( CHECK (sales_date < TO_DATE('04/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_avr2000
( CHECK (sales_date < TO_DATE('05/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_mai2008
( CHECK (sales_date < TO_DATE('06/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_juin2008
( CHECK (sales_date < TO_DATE('07/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_juil2008
( CHECK (sales_date < TO_DATE('08/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_aou2008
( CHECK (sales_date < TO_DATE('09/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_sep2008
( CHECK (sales_date < TO_DATE('10/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_oct2008
( CHECK (sales_date < TO_DATE('11/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_nov2008
( CHECK (sales_date < TO_DATE('12/01/2008','MM/DD/YYYY')) )
INHERITS (sales_range);

CREATE TABLE sales_dec2008
( CHECK (sales_date < TO_DATE('01/01/2009','MM/DD/YYYY')) )
INHERITS (sales_range);

-----------------------------------------------------------------
--creation d'une fonction pour insertions dans les tables filles

CREATE FUNCTION sales_range_handler()
RETURNS TRIGGER AS $$
DECLARE
BEGIN
IF tg_op = 'INSERT' THEN

IF new.sales_date < cast('2008-02-01' as timestamp)
THEN
INSERT INTO sales_jan2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-03-01' as timestamp)
THEN
INSERT INTO sales_fev2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-04-01' as timestamp)
THEN
INSERT INTO sales_mar2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-05-01' as timestamp)
THEN
INSERT INTO sales_avr2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-06-01' as timestamp)
THEN
INSERT INTO sales_mai2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-07-01' as timestamp)
THEN
INSERT INTO sales_juin2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-08-01' as timestamp)
THEN
INSERT INTO sales_juil2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-09-01' as timestamp)
THEN
INSERT INTO sales_aou2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-10-01' as timestamp)
THEN
INSERT INTO sales_sep2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-11-01' as timestamp)
THEN
INSERT INTO sales_oct2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2008-12-01' as timestamp)
THEN
INSERT INTO sales_nov2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

ELSIF new.sales_date < cast('2009-01-01' as timestamp)
THEN
INSERT INTO sales_dec2008
(salesman_id, salesman_name, sales_amount, sales_date)
VALUES (new.salesman_id, new.salesman_name,
new.sales_amount, new.sales_date);

END IF;
ELSIF tg_op = 'UPDATE' THEN
-- Do the same for update
NULL;
ELSIF tg_op = 'DELETE' THEN
-- Do the same for delete
NULL;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-----------------------------------------------------------------
--creation d'un trigger pour déclencher la fonction à chaque insertion
CREATE TRIGGER sales_range_handler_trg
BEFORE INSERT OR UPDATE OR DELETE
ON sales_range
FOR EACH ROW
EXECUTE PROCEDURE sales_range_handler();

--insertions des enregistrements
--sales_range (salesman_id, salesman_name, sales_amount, sales_date)

INSERT INTO sales_range VALUES(1,'Lewis',1.25, cast('2008-01-15' as timestamp));
INSERT INTO sales_range VALUES(2,'Lewis',2.25, cast('2008-02-15' as timestamp));
INSERT INTO sales_range VALUES(3,'Lewis',3.25, cast('2008-03-15' as timestamp));
INSERT INTO sales_range VALUES(4,'Lewis',4.25, cast('2008-04-15' as timestamp));
INSERT INTO sales_range VALUES(5,'Lewis',5.25, cast('2008-05-15' as timestamp));
INSERT INTO sales_range VALUES(6,'Lewis',6.25, cast('2008-06-15' as timestamp));
INSERT INTO sales_range VALUES(7,'Lewis',7.25, cast('2008-07-15' as timestamp));
INSERT INTO sales_range VALUES(8,'Lewis',8.25, cast('2008-08-15' as timestamp));
INSERT INTO sales_range VALUES(9,'Lewis',9.25, cast('2008-09-15' as timestamp));
INSERT INTO sales_range VALUES(10,'Lewis',10.25, cast('2008-10-15' as timestamp));
INSERT INTO sales_range VALUES(11,'Lewis',11.25, cast('2008-11-15' as timestamp));
INSERT INTO sales_range VALUES(12,'Lewis',12.25, cast('2008-12-15' as timestamp));

partition=# select * from sales_range;
salesman_id | salesman_name | sales_amount | sales_date
-------------+---------------+--------------+---------------------
1 | Lewis | 1 | 2008-01-15 00:00:00
2 | Lewis | 2 | 2008-02-15 00:00:00
3 | Lewis | 3 | 2008-03-15 00:00:00
4 | Lewis | 4 | 2008-04-15 00:00:00
5 | Lewis | 5 | 2008-05-15 00:00:00
6 | Lewis | 6 | 2008-06-15 00:00:00
7 | Lewis | 7 | 2008-07-15 00:00:00
8 | Lewis | 8 | 2008-08-15 00:00:00
9 | Lewis | 9 | 2008-09-15 00:00:00
10 | Lewis | 10 | 2008-10-15 00:00:00
11 | Lewis | 11 | 2008-11-15 00:00:00
12 | Lewis | 12 | 2008-12-15 00:00:00
(12 rows)
-----------------------------------------------------------------
vérification des insertions dans les tables filles:

partition=# select * from sales_jan2008;
salesman_id | salesman_name | sales_amount | sales_date
-------------+---------------+--------------+---------------------
1 | Lewis | 1 | 2008-01-15 00:00:00
(1 row)

partition=# select * from sales_fev2008;
salesman_id | salesman_name | sales_amount | sales_date
-------------+---------------+--------------+---------------------
2 | Lewis | 2 | 2008-02-15 00:00:00
(1 row)

partition=# select * from sales_mar2008;
salesman_id | salesman_name | sales_amount | sales_date
-------------+---------------+--------------+---------------------
3 | Lewis | 3 | 2008-03-15 00:00:00
(1 row)

partition=# select * from sales_avr2008;
salesman_id | salesman_name | sales_amount | sales_date
-------------+---------------+--------------+---------------------
4 | Lewis | 4 | 2008-04-15 00:00:00
(1 row)
...

Librement


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.