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 Re : Optimisation » 2 requettes similaires ont des traitements EXTREMEMENT différents » 28/09/2012 18:17:14

Franchement ca marche du tonnerre. Un très très grand merci.

Au passage, je précise que cet index en box prend pas mal de place smile

C'est vraiment super.

Merci beaucoup.

#2 Re : Optimisation » 2 requettes similaires ont des traitements EXTREMEMENT différents » 28/09/2012 17:09:22

Ok j'ai réussi à m'en sortir. Je suis en train de tester les performences pour voir si c'est mieux smile En tout cas merci du coup de main. Que ca marche ou que ca marche pas j'aurais appris quelque chose smile

#3 Re : Optimisation » 2 requettes similaires ont des traitements EXTREMEMENT différents » 28/09/2012 15:33:07

Salut,

J'ai le temps de tester et je galère un peu.

En gros j'ai créer une table avec un champ points(x,y)
Et j'ai créer une table avec un champ coordonnees box(x_min,x_max,y_min,y_max) et je n'arrive pas à comprendre comment marche l'intérogation de cette table.
Ou est-ce que je dois plutôt mettre box(x_min,y_min,x_max,y_max) ?

Est-ce que ma requette de selection est bonne aussi ?

select * from tables_tests.adresses_77 t1 join tables_tests.gps_77 t2 on (box ('2,39299','40,1') && t2.coordonnees);
=>
select * from tables_tests.adresses_77 t1 join tables_tests.gps_77 t2 on (box (t1.points,t1.points) && t2.coordonnees);

Et aussi un truc qui me turlupine.

Lorsque je fais la requête je dois mettre des virgules dans les donnés en "points" alors que dans la box ce sont des points et non des virgules. C'est normal ?
J'arrive à inserrer des données mais impossible de faire sortir a la recherche un résultat.

#4 Re : Optimisation » 2 requettes similaires ont des traitements EXTREMEMENT différents » 27/09/2012 14:51:55

Hum... Ca m'a l'air une bonne idée. Je ne connaissais pas le type box
Par contre à quoi correspond le type "point" ?

En gros est-ce que je dois faire une table genre ca :

CREATE TABLE carres (id (integer), x_box(box), y_box(box));

Et je dois l'interoger comme ca :

SELECT * FROM points JOIN carres on (box(points.X,points.X) && carres.box_x) AND (box(points.Y,points.Y) && carres.box_y)

J'ai bien compris ?

#5 Re : Optimisation » 2 requettes similaires ont des traitements EXTREMEMENT différents » 27/09/2012 12:50:34

Tu veux dire sur id_maille_200m ? Je dois indexer ce champ ?

Franchement j'avoue ne pas du tout savoir comme lire le EXPLAIN.

#6 Re : Optimisation » 2 requettes similaires ont des traitements EXTREMEMENT différents » 27/09/2012 10:57:23

Bonjour smile

Voici

Nested Loop  (cost=0.00..353722.89 rows=124893 width=16) (actual time=261158.061..10304193.501 rows=99 loops=1)
  Join Filter: ((t2."X" >= (t1.x_min)::double precision) AND (t2."X" <= (t1.x_max)::double precision) AND (t2."Y" >= (t1.y_min)::double precision) AND (t2."Y" <= (t1.y_max)::double precision))
  ->  Seq Scan on gps_22 t1  (cost=0.00..3431.80 rows=177480 width=44) (actual time=0.036..1399.621 rows=177480 loops=1)
  ->  Materialize  (cost=0.00..20572.83 rows=57 width=20) (actual time=0.012..10.274 rows=2924 loops=177480)
        ->  Seq Scan on adresses_22 t2  (cost=0.00..20572.55 rows=57 width=20) (actual time=1570.240..1726.376 rows=2924 loops=1)
              Filter: ((id_maille_200m)::text = '0'::text)
Total runtime: 10304211.648 ms
Nested Loop  (cost=0.00..88186069.17 rows=33397899 width=16) (actual time=3060.373..3060.373 rows=0 loops=1)
  Join Filter: ((t2."X" >= (t1.x_min)::double precision) AND (t2."X" <= (t1.x_max)::double precision) AND (t2."Y" >= (t1.y_min)::double precision) AND (t2."Y" <= (t1.y_max)::double precision))
  ->  Seq Scan on gps_31 t1  (cost=0.00..3096.38 rows=161738 width=44) (actual time=4.612..442.935 rows=161738 loops=1)
  ->  Materialize  (cost=0.00..12562.25 rows=16726 width=20) (actual time=0.012..0.012 rows=0 loops=161738)
        ->  Seq Scan on adresses_31 t2  (cost=0.00..12478.62 rows=16726 width=20) (actual time=1504.082..1504.082 rows=0 loops=1)
              Filter: ((id_maille_200m)::text = '0'::text)
Total runtime: 3060.469 ms

#7 Optimisation » 2 requettes similaires ont des traitements EXTREMEMENT différents » 26/09/2012 14:37:40

FFW_Rude
Réponses : 11

Bonjour,

Je suis nouveau sur postgres (commencé il y a quelques mois, venant de Mysql).
J'ai un soucis sur une requête qui met 2minutes pour tourner sur une table et 5H sur l'autre (c'est la même requête).

La première table contient des couples de coordonées GPS et la deuxième des carrés délimité par des coordonées GPS.

En gros ca ressemble à ca :

adresses_01 (id,X,Y)
gps_01 (id,x_min,x_max,y_min,y_max).

"
SELECT
    t2.id,
FROM
    tables_gps.gps_01 t1
INNER JOIN
    tables_adresses.adresses_01 t2
ON
    t2."X" BETWEEN t1.x_min AND t1.x_max AND t2."Y" BETWEEN t1.y_min AND t1.y_max
WHERE
    t2.id='0'
"

Il y a environ 250000 lignes dans chaque table (adresses_XX et gps_XX)

J'ai des index sur le couple X,Y de la table adresse et un autre dans la table gps sur les quatres champs (x,y)
Etant donné que je fais des update fréquent sur les deux tables, id est une clé primaire sur adresses_XX et gps_XX

Du coup je ne comprend pas quelle peut etre la raison de ces différences de temps de traitement. Je me demandais si la CLUSTERISATION des index ne pourrait pas m'aider mais si oui, dois-je mettre le CLUSTER sur la clé primaire ? Ou sur mes index X,Y et x_min,y_min,x_max,y_max ?

Je sais que c'est pas forcement très clair mais si quelqu'un à besoin de précision, n'hésitez pas à demander.

Merci d'avance.

Pied de page des forums

Propulsé par FluxBB