Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/11/2010, 16h56   #1
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Par défaut Performance requete Postgis

Bonjour,

J'ai une requête qui permet de chercher des personnes dans un rayon de x kms autour de chez soi du genre :

Code :
1
2
3
4
5
6
SELECT pseudo FROM ville a,ville b, membre
WHERE contains(buffer(a.geom ,0.9) ,b.geom)
AND a.ville_nom='LILLE'
AND a.ville_dep ='59'
AND membre_ville_id =b.ville_id
AND a.ville_dep = b.ville_dep
C'est assez rapide car la recherche se limite au département ou à la région.

Mais pour n'oublier personne, je ne peux me limiter à une recherche dans la même région car des membres se situent aux abords de régions limitrophes.

Alors dans ce cas la requête scanne toute la base et là ça prend un temps fou.

J'ai pensé à limiter la recherche aux régions limitrophes mais je ne vois pas comment faire cela à part connaitre pour chaque région ces régions limitrophes et tout rentrer dans une base...Bref pas évident.

Avez-vous une idée pour améliorer la rapidité ?

Cordialement
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 17h23   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 932
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 932
Points : 18 121
Points : 18 121
Envoyer un message via MSN à CinePhil
Je ne suis pas spécialiste en SIG mais n'y a t-il pas dans Postgis une fonction qui permet de trouver les voisins d'un polygone ou de dire si le polygone X est voisin du polygone Y ?
Avec une auto-jointure ça devrait être possible ?

En parlant des jointures, la syntaxe normalisée depuis 1992 utilise l'opérateur JOIN !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/11/2010, 17h28   #3
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Je vous avoue que moi non plus je ne suis pas un "spécialiste " en SIG . Mes connaissance sont limitées à la base...
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 17h34   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 932
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 932
Points : 18 121
Points : 18 121
Envoyer un message via MSN à CinePhil
Regarde déjà chez SQLPro si tu trouves ton bonheur.

Il y a aussi ce forum spécialisé en SIG dans lequel tu trouveras peut-être plus facilement de l'aide qu'ici.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 17h48   #5
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Merci !
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 09h40   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 930
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 930
Points : 17 724
Points : 17 724
Votre prédicat n'est pas sargeable contains(buffer)... + departement

Il faut utiliser distance et pas buffer

Avez vous posé un index spatial sur la colonne geom ?

Au passage je remarque que votre façon de faire des jointures date de près de 20 ans. Depuis 1992 c'est JOIN qu'il faut utiliser :

Au final quelque chose comme ça :

Code :
1
2
3
4
5
6
7
8
SELECT pseudo 
FROM   ville a
       INNER JOIN ville b
             ON distance(a.geom, b.geom) < 9000
       INNER JOIN membre AS m
             ON m.membre_ville_id =b.ville_id
WHERE a.ville_nom='LILLE'
  AND a.ville_dep ='59'

Bref, apprenez SQL. C'est un vrai langage. Mon site web comme mon bouquin, peuvent vous y aider !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/11/2010, 10h10   #7
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Rassurez-vous ! je ne fais pas mes jointures comme celà et j'utilise JOIN depuis plus de 15 ans !!!

Ne pouvant pas mettre le vrai code de ma requête sur le site je comprends que cela puisse vous froisser à sa lecture mais c'est ainsi ce n'est qu'un exemple..

Quant à l'utilisation de buffer, c'est ce que l'on m'a conseillé sur un forum de SIG et c'est la requête que je retrouve dans des tutoriaux consacrés à POSTGIS.

Cordialement

PS : oui il y a des index spatiaux sur la colonne geom et je débute en SIG. Merci pour vos encouragements
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 10h56   #8
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
PS : je viens d'acheter votre bouquin !

Qui sait, il va peut-être me permettre d'optimiser mes requêtes...

En tous cas merci pour le conseil sur l'utilisation de distance() au lieu de buffer() dans la recherche dans un rayon de x kms. Effectivement c'est beaucoup plus rapide.

J'utilisais déjà distance() pour le calcul des kms mais on me l'avait pas préconisé pour une recherche dans un rayon de x kms.

Cordialement
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2010, 11h58   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 930
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 930
Points : 17 724
Points : 17 724
L'utilisation de buffer dans ce cas est d'une grande bêtise. Lisez des articles intelligent. Évitez les articles rédigés par des Experts Néophytes, conséquence de la popularisation de l'informatique....

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2010, 18h20   #10
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Voici ce qu'un expert en SIG me dit :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
Ensuite si je reprends la dernière postée, ceci devrait améliorer sensiblement les perfs:
 
SELECT inscrit_pseudo, b.ville_nom, b.ville_dep 
FROM   ville a
       INNER JOIN ville b
             ON intersects((buffer(a.geom, 0.9), b.geom) AND ST_Expand(a.geom, 0.9) && b.geom 
       INNER JOIN inscrit AS m
             ON m.inscrit_ville_id =b.ville_id
WHERE a.ville_nom='LILLE' AND a.ville_dep = '59'
***************
A+
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2010, 18h50   #11
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
Une fois testée la requête est 10 fois plus lente que celle n'utilisant pas buffer mais distance()

Démonstration faite qu'il ne faut pas utiliser buffer dans ce cas.

Par contre ce que j'aimerais savoir est s'il vaut mieux utiliser distance() ou distance_sphere()

Cordialement

PS : Quels articles intelligents sur Postgis me conseillez-vous ?
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 10h55   #12
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 930
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 930
Points : 17 724
Points : 17 724
Je ne connais pas distance_sphere qui ne fait pas partie de la norme SQL ou du standard OGC, mais je suppose que c'est pour palier les défaut de PostGIS qui ne sait pas travailler sur le géoïde terrestre, c'est à dire calculer la distance sur la courbure de la terre.
Pour cela la norme impose le passage par un SRID.
D'après ce que j'ai vu cela calcule sur une sphere proche de la terre, mais pas sur le géoïde terrestre qui n'est pas sphérique !

Donc tout dépend de votre besoin.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 18h09   #13
Membre habitué
 
Inscription : mai 2002
Messages : 635
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 635
Points : 109
Points : 109
mais pourquoi est-ce idiot d'utiliser Buffer() dans mon cas ?

Cordialement
viny est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 12h39   #14
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 930
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 930
Points : 17 724
Points : 17 724
A votre avis, appliquer 2 fonctions à la place cela va
1) aller plus vite
2) aller aussi vite
3) aller moins vite
qu'une seule fonction ?

En sus, comme je crois l'avoir déjà dit, ces fonctions ne sont pas "sargeable".

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h00.


 
 
 
 
Partenaires

Hébergement Web