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

Postgres 8.1 problème avec les indexes

Technique - général | Postgres 8.1 problème avec les indexes

Par pauls le 11/09/2006 - 17:28

Bonjour,

Mon problème c'est que j'ai une table, 550000 données la même requete, les même index.
Sous mysql j'ai un résultats dans la minute, sous pg au bout d'une heure la requète n'a toujours pas finie.

VoilĂ  la table :
CREATE TABLE stats_appels4
(
id int4 NOT NULL,
cat int4 NOT NULL DEFAULT 0,
appelant varchar(20) NOT NULL DEFAULT ''::character varying,
date timestamp NOT NULL,
CONSTRAINT prim_stats_appel4_id PRIMARY KEY (id),
)

Qui contient 550 000 enregistrements.

Sur mysql 5.0 je crée la meme table avec comme index :
(cat,appelant,date)

Je fais la requete :
SELECT date_format(a.date ,'%Y-%m'),COUNT(DISTINCT(a.appelant))
FROM stats_appels AS a
WHERE a.cat = 30
AND 0 = ( SELECT COUNT(b.id)
FROM stats_appels AS b
WHERE b.cat = 30 AND MONTH( b.date ) < MONTH( a.date )
AND a.appelant = b.appelant )
AND YEAR( a.date ) = 2006 GROUP BY MONTH( a.date );

Qui a pour sémentique : Je veux le nombre de nouveaux appelant par mois.

J'ai ma réponse dans la minute.

Maintenant j'ai la même table, les même données
et l'index :
CREATE INDEX ind_sta4_cat_app ON stats_appels4 (cat,appelant,date);

Je fais la requète :
SELECT EXTRACT(MONTH FROM a.date)::integer, COUNT(DISTINCT(a.appelant))::integer
FROM public.stats_appels4 AS a
WHERE (a.cat::integer = 30)
AND 0= (SELECT COUNT(b.id)::integer
FROM stats_appels4 AS b
WHERE (a.cat::integer = 30)
AND EXTRACT(MONTH FROM b.date)::integer < EXTRACT(MONTH FROM a.date)::integer
AND b.appelant = a.appelant )
AND EXTRACT(YEAR FROM a.date )::integer = 2006
GROUP BY EXTRACT(MONTH FROM a.date )::integer;

Il me semble que c'est la mĂŞme que pour mysql.

Le problème c'est que sur postgresql sur la meme machine au bout d'une heure je n'ai toujours pas les résultats.
Je ne comprends pas d'oĂą ca peut venir. J'ai fais 50 analyze, vacuum analyze et toujours pareil :(

Le problème n'est pas la structure de la table, ni la requète(ce ne sont que des tests), le problème est que je n'arrive pas a obtenir de résultats sur postgresql.
J'ai du foirer un truc dans la configuration mais je vois pas quoi :(

Ps: je suis sous debian sid et postgresql 8.1

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.

Pour commencer

sparky/ = 13 Septembre, 2006 - 13:13

Tu pourrais faire

1) un explain plan pour voir si l'index est utilisé
2) augmenter le paramètre work_mem (voir doc)
3) changer certains paramètres dans postgresql.conf
4) Si tu en as le temps faire un select * from pg_setting et le placer ici


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