CREATE TABLE stats_appels ( id serial NOT NULL, cat int4 NOT NULL, appelant varchar(20) NOT NULL, date timestamp NOT NULL, CONSTRAINT prim_s_a_id PRIMARY KEY (id), )
et 1 index sur appelant, 1 sur cat, et 1 sur date
j'ai prés de 550000 enregistrement dans cette table et je dois savoir quels est le nombre de nouveaux appelant par mois .(avec comme "seule" restriction cat=30)
J'ai donc fait en 'mysql':
SELECT date_format(a.date ,'%Y-%m'), COUNT(DISTINCT(a.appelant)) FROM stats_appels AS a WHERE a.cat =30 AND a.appelant NOT IN ( SELECT b.appelant FROM stats_appels AS b WHERE b.cat =a.cat AND MONTH( b.date ) <= MONTH( DATE_SUB( a.date, INTERVAL 1 MONTH ) ) ) AND YEAR( a.date ) = '2006' GROUP BY MONTH( a.date );
et en PGSQL:
SELECT EXTRACT(MONTH FROM a.date ), COUNT(DISTINCT(a.appelant)) FROM public.stats_appels AS a WHERE a.cat=30 AND a.appelant NOT IN ( SELECT b.appelant FROM public.stats_appels AS b WHERE b.cat=30 AND EXTRACT( MONTH FROM b.date)::integer <= (EXTRACT( MONTH FROM a.date)::integer - 1) ) AND EXTRACT(YEAR FROM a.date)::integer = 2006 GROUP BY EXTRACT(MONTH FROM a.date);
$ mysql --version mysql Ver 14.12 Distrib 5.0.24a, for pc-linux-gnu (i486) using readline 5.1
La requete mets environs 5-10min suivant l'utilisation de mon pc
$ psql --version psql (PostgreSQL) 8.1.4 contient le support pour l'édition de la ligne de commande La requete n'a jamais fini sont excution j'ai toujours stop apres 10min.
Je sais que lors de l'insertion je peux checher que l'appelant est deja dans la base et rajouter un champs (first) et le mettre a vrai mais c'est pas moi le dev de l'app qui renseigne la base.
1°) Quelqu'un aurait il une idée pour optimiser tout ca ? 2°) Quelqu'un sait pourquoi pgsql est plus lent que mysql ?
Marsh Posté le 07-09-2006 à 15:36:05
Voici ma table :
CREATE TABLE stats_appels
(
id serial NOT NULL,
cat int4 NOT NULL,
appelant varchar(20) NOT NULL,
date timestamp NOT NULL,
CONSTRAINT prim_s_a_id PRIMARY KEY (id),
)
et 1 index sur appelant, 1 sur cat, et 1 sur date
j'ai prés de 550000 enregistrement dans cette table et je dois savoir quels est le nombre de nouveaux appelant par mois .(avec comme "seule" restriction cat=30)
J'ai donc fait en 'mysql':
SELECT date_format(a.date ,'%Y-%m'), COUNT(DISTINCT(a.appelant))
FROM stats_appels AS a
WHERE a.cat =30
AND a.appelant NOT IN (
SELECT b.appelant
FROM stats_appels AS b
WHERE b.cat =a.cat
AND MONTH( b.date ) <= MONTH( DATE_SUB( a.date, INTERVAL 1 MONTH ) )
)
AND YEAR( a.date ) = '2006'
GROUP BY MONTH( a.date );
et en PGSQL:
SELECT EXTRACT(MONTH FROM a.date ), COUNT(DISTINCT(a.appelant))
FROM public.stats_appels AS a
WHERE a.cat=30
AND a.appelant NOT IN (
SELECT b.appelant
FROM public.stats_appels AS b
WHERE b.cat=30
AND EXTRACT( MONTH FROM b.date)::integer <= (EXTRACT( MONTH FROM a.date)::integer - 1)
)
AND EXTRACT(YEAR FROM a.date)::integer = 2006
GROUP BY EXTRACT(MONTH FROM a.date);
$ mysql --version
mysql Ver 14.12 Distrib 5.0.24a, for pc-linux-gnu (i486) using readline 5.1
La requete mets environs 5-10min suivant l'utilisation de mon pc
$ psql --version
psql (PostgreSQL) 8.1.4
contient le support pour l'édition de la ligne de commande
La requete n'a jamais fini sont excution j'ai toujours stop apres 10min.
Je sais que lors de l'insertion je peux checher que l'appelant est deja dans la base et rajouter un champs (first) et le mettre a vrai mais c'est pas moi le dev de l'app qui renseigne la base.
1°) Quelqu'un aurait il une idée pour optimiser tout ca ?
2°) Quelqu'un sait pourquoi pgsql est plus lent que mysql ?