IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Performance requete Postgis


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Je vous avoue que moi non plus je ne suis pas un "spécialiste " en SIG . Mes connaissance sont limitées à la base...

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Merci !

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    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

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    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

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Voici ce qu'un expert en SIG me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    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 ?

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    mais pourquoi est-ce idiot d'utiliser Buffer() dans mon cas ?

    Cordialement

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Performance requete client/serveur
    Par Shiven dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 30/11/2007, 19h15
  2. pb performance requete avec différence dates
    Par marion782 dans le forum SQL
    Réponses: 20
    Dernier message: 11/12/2006, 17h33
  3. [9i] Performance requete UPDATE + IN
    Par bob33 dans le forum Oracle
    Réponses: 12
    Dernier message: 26/10/2006, 15h22
  4. [9i]Performance requete dlink
    Par mezoo dans le forum Oracle
    Réponses: 8
    Dernier message: 31/08/2006, 09h16
  5. Performance requete SQL
    Par billout9 dans le forum Oracle
    Réponses: 4
    Dernier message: 28/11/2005, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo