Vous n'êtes pas identifié(e).

#1 21/08/2015 14:48:15

postgresfan
Membre

Requete table partionnée

Bonjour,

j'ai une table partionnée avec 12 partitions:

Comment puis je obtenir le nombre de lignes de chaque partition?



Code:

CREATE TABLE mkt.t_fac_member_mails
(
ibroadlogid integer NOT NULL,
ideliveryid integer NOT NULL,
memberid integer NOT NULL,
siteid integer NOT NULL,
mail_id_quot integer NOT NULL,
istatus smallint NOT NULL,
histoloadid integer NOT NULL
)
WITH (
OIDS=FALSE
)
DISTRIBUTED BY (ibroadlogid, ideliveryid, memberid, mail_id_quot)
PARTITION BY RANGE(mail_id_quot)
(
START (20120301) END (20120331) INCLUSIVE WITH (appendonly=false),
START (20120401) END (20120430) INCLUSIVE WITH (appendonly=false),
START (20120501) END (20120531) INCLUSIVE WITH (appendonly=false),
START (20120601) END (20120630) INCLUSIVE WITH (appendonly=false),
START (20120701) END (20120731) INCLUSIVE WITH (appendonly=false),
START (20120801) END (20120831) INCLUSIVE WITH (appendonly=false),
START (20120901) END (20120930) INCLUSIVE WITH (appendonly=false),
START (20121001) END (20121031) INCLUSIVE WITH (appendonly=false),
START (20121101) END (20121130) INCLUSIVE WITH (appendonly=false),
START (20121201) END (20121231) INCLUSIVE WITH (appendonly=false),
DEFAULT PARTITION other WITH (appendonly=false)
)
;
ALTER TABLE mkt.t_fac_member_mails OWNER TO group_owner_prod;
GRANT ALL ON TABLE mkt.t_fac_member_mails TO group_owner_prod;
GRANT SELECT ON TABLE mkt.t_fac_member_mails TO g_pr_mkt_r;



et une partition:



CREATE TABLE mkt.t_fac_member_mails_1_prt_1
OF
(

CONSTRAINT t_fac_member_mails_1_prt_1_check CHECK (mail_id_quot >= 20120301 AND mail_id_quot <= 20120331)
)
INHERITS (mkt.t_fac_member_mails)
WITH (APPENDONLY=false,
OIDS=FALSE
)
DISTRIBUTED BY (ibroadlogid, ideliveryid, memberid, mail_id_quot);
ALTER PARTITION mkt.t_fac_member_mails_1_prt_1 OWNER TO group_owner_prod;
GRANT ALL ON PARTITION mkt.t_fac_member_mails_1_prt_1 TO group_owner_prod;
GRANT SELECT ON PARTITION mkt.t_fac_member_mails_1_prt_1 TO g_pr_mkt_r;

---------

merci

Hors ligne

#2 21/08/2015 15:26:57

Marc Cousin
Membre

Re : Requete table partionnée

Il y a plusieurs solutions: faire des SELECT ONLY sur chacune des partitions (mais j'imagine que ce n'est pas la façon demandée).

Sinon, il y a un champ caché «tableoid» qu'on peut interroger quand on fait un select. Il retourne l'oid de la table dans pg_class. C'est une fonctionnalité à peu près inutile, sauf dans le cas du partitionnement:

SELECT tableoid::regclass,count(*) from ma_table_partitionnee group by tableoid::regclass

devrait le faire

::regclass, c'est un petit raccourci, où on cast l'oid en élément de pg_class directement. Ça permet de retourner le nom de la table (préfixée de son schéma si il y a ambiguïté)


Marc.

Hors ligne

#3 21/08/2015 15:39:10

gleu
Administrateur

Re : Requete table partionnée

Ce n'est pas une requête acceptée par PostgreSQL, donc je n'en ai aucune idée. Je suppose que vous utilisez PostgreSQL Plus Advanced Server. Le mieux dans ce cas est d'utiliser leur équipe de support ou leur forums.


Guillaume.

Hors ligne

#4 21/08/2015 15:40:14

Marc Cousin
Membre

Re : Requete table partionnée

Ah, tiens, oui, tu as raison gleu, c'est pas un Postgres «standard» smile


Marc.

Hors ligne

#5 24/08/2015 11:16:11

postgresfan
Membre

Re : Requete table partionnée

oui c est du Greenplum smile
bien vu

PS:


SELECT tableoid::regclass,count(*) from mkt.t_fac_member_mails_1_prt_3 group by tableoid::regclass

ca renvoit rien smile

Hors ligne

#6 24/08/2015 11:27:07

Marc Cousin
Membre

Re : Requete table partionnée

OK. Leur partitionnement doit fonctionner autrement. À voir avec eux smile


Marc.

Hors ligne

Pied de page des forums