From: | "thomas(dot)silvi" <thomas(dot)silvi(at)laposte(dot)net> |
---|---|
To: | jsganaye13-devforum(at)yahoo(dot)fr |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: utilisation d'un array en sortie de select |
Date: | 2005-09-05 20:42:09 |
Message-ID: | 431CADA1.30201@laposte.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Bonjour,
voici plutot des questions / suggestions que des reponses :(
* pourquoi le type array ? et pas plutot n lignes dans statsdata ?
Si cette requete est appelee frequement, cela serait plus simple.
+ requete simple
- ?
Si la precision de la date est limitee a jour/mois/annee, alors une
colonne statcount peut etre ajoutee :
si l'evenement existe alors statcount est incrementee de 1 (update)
sinon insert. Cela prend plus de temps
car c'est un test suivi d'update ou insert, et dans le cas ou il y
aurait beaucoup d'update, il faudrait un vacuum).
Mais la requete n'est plus qu'un simple select avec un filtre sur la
date.
+ requete encore plus simple
- la saisie d'un evement prend plus de temps
- si beaucoup d'evement alors il faut faire des vacuum frequement
* si l'array te semble indispensable, cela pourrait etre
interressant que le tableau soit trie pour minimiser
la taille de la table temporaire qui correspond a l'agregation
temporaire (modestat,evtliste). Mais bon tu utiliseras
quand meme un table function.
Thomas
jsganaye13-devforum(at)yahoo(dot)fr a écrit :
> Bonjour,
>
> j'utilise depuis peu Postgres et j'ai un probleme concernant les array.
> Voici le cas :
>
> j'ai une table du genre :
>
> CREATE TABLE statsdata (
> datestat date NOT NULL DEFAULT '2005-08-31'::date,
> modestat char(1) NOT NULL DEFAULT 'C'::bpchar,
> evtliste varchar(3)[]
> ) WITHOUT OIDS;
>
> je souhaite faire une requete du genre :
>
> SELECT
> evt, -- une ligne pour chaque élément de la
> liste evtliste
> s.modestat,
> count(*) AS statcount
> FROM statsdata s
> WHERE s.datestat = '2005-08-31'
> AND evtliste is not null
> GROUP BY evt, s.modestat;
>
> Le problème est donc que je veux faire une sorte de produit cartésien
> entre les lignes selectionnées dans la table et la liste d'évènement
> (pour chacune des ligne).
>
> Je ne sais pas quoi mettre à la place de evt ou comment modifier la
> requête pour arriver à mes fins.
>
> La seule solution que j'ai envisager est de créer une TABLE FUNCTION
> qui exécute la requête de restriction puis qui pour chaque valeur du
> champ evtliste, retourne une ligne... d'ou quelque chose du genre :
>
> SELECT
> s.evt,
> s.modestat,
> count(*) AS statcount
> FROM getStatDataForDate('2005-09-01') s
> GROUP BY s.evt, s.modestat;
>
> Mais j'espérais trouver une solution plus simple (que d'écrire une
> Table Function) et plus efficace en terme de performance car une fois
> que les données sont lues par la fonction et qu'elle les retourne,
> fini les indexes....
>
>
> Voila, j'espère avoir été claire, si vous avez une solution (ou des
> solutions) ou des pistes à explorer, ça m'intéresse fortement.
>
> merci
> Jean-Sébastien
>
> ------------------------------------------------------------------------
> *Appel audio GRATUIT partout dans le monde* avec le nouveau Yahoo!
> Messenger
> Téléchargez le ici !
> <http://us.rd.yahoo.com/messenger/mail_taglines/default/*http://fr.messenger.yahoo.com>
From | Date | Subject | |
---|---|---|---|
Next Message | Sébastien Dinot | 2005-09-06 09:41:13 | Jointure externe |
Previous Message | jsganaye13-devforum | 2005-09-01 16:21:21 | utilisation d'un array en sortie de select |