PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 16/03/2011 13:22:03

Jean-Marie
Membre

Requêtes par rapport à la date d'insertion des enregistrements

Bonjour

je souhaite faire des requêtes sur la date d'insertion des enregistrements
mais je m'aperçois que la requête ne se termine pas

si je prends l'exemple suivant basé sur le champ date de la donnée (et non pas date d'insertion) :

select date, x(coord), y(coord), insertdate from table where date between '2011-03-15 09:35:30' and '2011-03-15 9:35:40' and coord && st_setsrid('BOX(-180 -90, 180 90)'::box2d,4326);

j'obtiens bien un résultat immédiat :

          date           |    x     |    y     |         insertdate         
-------------------------+----------+----------+----------------------------
2011-03-15 09:35:34.974 | -57.4305 |  -2.4284 | 2011-03-15 09:37:00.679191
2011-03-15 09:35:36.755 | -36.9402 | -21.7172 | 2011-03-15 09:37:02.429322
2011-03-15 09:35:37.27  | -37.2161 | -21.6957 | 2011-03-15 09:37:02.743891
2011-03-15 09:35:39.295 | -14.6501 |   0.0889 | 2011-03-15 09:37:04.958068
2011-03-15 09:35:39.366 | -14.6871 |   0.1062 | 2011-03-15 09:37:05.073541
(5 rows)

si maintenant j'essaie sur la date d'insertion :

select date, x(coord), y(coord) from table where insertdate between '2011-03-15 09:37:00.679191' and '2011-03-15 09:37:05.073541' and coord && st_setsrid('BOX(-180 -90, 180 90)'::box2d,4326);

la requête bloque indéfiniment et je suis obligé de l'interrompre

quelqu'un sait-il comment je peux résoudre ce problème ?

merci d'avance

Jean-Marie

Hors ligne

#2 16/03/2011 15:03:12

gleu
Administrateur

Re : Requêtes par rapport à la date d'insertion des enregistrements

Comme ça, sans plus d'infos, non.

Il serait intéressant de fournir la version de PostgreSQL, un EXPLAIN de la requête, ce que vous entendez par "bloque indéfiniment" (autrement dit, au bout de combien de temps l'avez-vous arrêté?), des infos sur la table (volumétrie, stats sur les données), etc.


Guillaume.

Hors ligne

#3 16/03/2011 16:47:58

Jean-Marie
Membre

Re : Requêtes par rapport à la date d'insertion des enregistrements

après analyse :
la requête a mis environ 11 minutes pour s'exécuter
il y a environ 34 000 000 enregistrements
la table a une taille de 15 GB

Hors ligne

#4 16/03/2011 16:50:39

Jean-Marie
Membre

Re : Requêtes par rapport à la date d'insertion des enregistrements

ah j'ai oublié la version :
PostgreSQL 8.1.11 on x86_64-redhat-linux-gnu

Hors ligne

#5 16/03/2011 17:48:37

gleu
Administrateur

Re : Requêtes par rapport à la date d'insertion des enregistrements

Manque l'EXPLAIN. Et comme la requête peut s'exécuter, un EXPLAIN ANALYZE serait beaucoup plus intéressant.


Guillaume.

Hors ligne

#6 16/03/2011 19:28:45

Jean-Marie
Membre

Re : Requêtes par rapport à la date d'insertion des enregistrements

désolé je n'avais pas capté

voici le résultat :

EXPLAIN ANALYZE select date, x(coord), y(coord) from ldb.stroke where insertdate between '2011-03-15 09:37:00.679191' and '2011-03-15 09:37:05.073541' and coord && st_setsrid('BOX(-180 -90, 180 90)'::box2d,4326);
                                                                                                                                                                                            QUERY PLAN                                                                                                                                                                                             
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on stroke  (cost=0.00..1528695.10 rows=1 width=33) (actual time=681410.009..684291.580 rows=5 loops=1)
   Filter: ((insertdate >= '2011-03-15 09:37:00.679191'::timestamp without time zone) AND (insertdate <= '2011-03-15 09:37:05.073541'::timestamp without time zone) AND (coord && '0103000020E6100000010000000500000000000000008066C000000000008056C000000000008066
C0000000000080564000000000008066400000000000805640000000000080664000000000008056
C000000000008066C000000000008056C0'::geometry))
Total runtime: 684306.400 ms
(3 rows)

Hors ligne

#7 16/03/2011 20:20:52

gleu
Administrateur

Re : Requêtes par rapport à la date d'insertion des enregistrements

Le planificateur estime qu'il va récupérer une seule ligne sur toute la table, ce qui laisse supposer qu'il choisirait un index s'il en avait un qui soit valable. On pourrait avoir la définition de la table ? par exemple, ce qu'affiche la commande \d stroke à partir de psql. Ou simplement la définition des index sur cette table ?


Guillaume.

Hors ligne

#8 17/03/2011 10:36:38

Jean-Marie
Membre

Re : Requêtes par rapport à la date d'insertion des enregistrements

Indexes:
    "stroke_coord_key" gist (coord)
    "stroke_date_key" btree (date)
    "stroke_num_key" btree (num)
Check constraints:
    "enforce_dims_coord" CHECK (ndims(coord) = 2)
    "enforce_geotype_coord" CHECK (geometrytype(coord) = 'POINT'::text OR coord IS NULL)
    "enforce_srid_coord" CHECK (srid(coord) = 4326)

Hors ligne

#9 17/03/2011 10:40:47

Marc Cousin
Membre

Re : Requêtes par rapport à la date d'insertion des enregistrements

Vous n'avez pas d'index sur insertdate.


Marc.

Hors ligne

#10 17/03/2011 11:52:22

Jean-Marie
Membre

Re : Requêtes par rapport à la date d'insertion des enregistrements

ok, merci bien pour votre aide

Jean-Marie

Hors ligne

Pied de page des forums