[OPTIMASATION MYSQL/PGSQL] requetes imbriquées

requetes imbriquées [OPTIMASATION MYSQL/PGSQL] - SQL/NoSQL - Programmation

Marsh Posté le 07-09-2006 à 15:36:05    

:hello:  
 
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 ?

Reply

Marsh Posté le 07-09-2006 à 15:36:05   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed