Re: [OSM-dev-fr] Trouver des objets ne possédant pas certains tags
Ca c'est la théorie, mais certains moteurs SQL admettent dans leurs index (pourvu qu'ils ne contiennent pas la restriction UNIQUE et donc acceptent d'indexer les doublons) d'inclure les valeurs NULL. On peut faire des jointures sur des valeurs NULL de façon efficace (et d'ailleurs la construction d'une jointure externe impose justement de créer un index non unique admettant des valeurs NULL, ce la se fait par tri de chaque index à joindre, et une fusion linéaire des deux dans l'index final. Ce qui est long c'est justement le fait de réaliser cette fusion de deux index si les deux index à croiser sont longs. Un moteur SQL peut aussi réaliser la fusion non pas linéairement mais par recherche indexée de l'un dans l'autre sans créer d'index temporaire, en fonction des volumétrie (possible si les deux index à croiser sont de taille très différente, et surtout si le plus petit peut tenir en peu de pages mémoire; dans ce cas le moteur fait le croisement en parcourant linéairement avec un curseur interne le plus grand et effectuant une recherche indexée sur le plus petit avant de faire ensuite l'inverse si c'est une jointure externe mixte). Une jointure externe n'est donc pas nécessairement "longue" ou "coûteuse", cela dépend des volumétries et ce n'est pas long si un des deux index est très petit, et si le moteur SQL dispose d'un optimiseur statistique capable d'estimer ces volumétries ; cela dépend aussi des formats d'index supportés, de la taille de son cache de pages en mémoire, etc. En effet, savoir si une valeur n'est pas présente dans un index a exactement le même coût que de savoir si elle y est. Les scans complets de la table complète (ou de la table ordonnée en index primaire) n'ont lieu qu'en cas d'absence totale d'index secondaire contenant la colonne recherchée (un bon optimiseur SQL ne lit pas forcément la table complète mais peut se contenter de faire un full scan d'un index secondaire contenant moins de colonnes, même si la colonne cherchée n'est pas la première, si cet index secondaire sépare maintient la séparation des colonnes (ce qui n'est pas le cas des index par hachage des colonnes combinées : le format de l'index joue un rôle sur le fait qu'un moteur pourra l'utiliser ou pas). Enfin le choix des index peut varier d'une requête à l'autre en fonction des éléments cherchés et de leur sélectivité estimée (autrement dit le moteur peut estimer la sélectivité d'une clé sans parcourir l'index entier, s'il gère dans la racine de son index des statistiques de sélectivité par "tranche" de valeurs, et si ces statistiques sont maintenues à jour, ce qui en général n'est pas instantané en cas de modification des contenus, car cette mise à jour à un coût lors des insertions, mises à jour ou suppression d'éléments dans une table et est souvent fait en arrière-plan, soit par une tâche programmée, soit lorsque le moteur dispose de ressources pour une tâche non prioritaire en file d'attente. Les plans d'exécution effectifs pour une même requête avec les mêmes contenus dans les tables et les même paramètres de requête peuvent donc varier dans le temps en fonction de ces mises à jour des statistiques de sélectivité). Mais si on emploie MySQL qui n'a pas de tel optimiseur statistique, alors oui les jointures externes peuvent être coûteuses car les plans d'exécution statiques ne sont pas optimum. car pas évolutifs selon les sélectivités dynamiques. De ce point de vue-là, PostgreSQL est bien meilleur que MySQL qui reste un moteur un peut trop simpliste où toute l'optimisation se fait manuellement, selon la façon dont on a directement écrit la requête, sans utiliser de table dynamique de sélectivité des clés pour chiosir parmi plusieurs plans alternatifs lequel sera le plus optimal: pour les jointures externes, MySQL ne sait pas faire autre chose que des scans complets et le plus souvent uniquement sur les tables primaires et non sur les index secondaires possibles pourtant plus petits (ça explique aussi la lourdeur d'écriture des requêtes en MySQL dès qu'on fait des jointures externes car il faut tout lui expliquer manuellement, il n'a pas d'autonomie pour faire son choix dynamiquement comme peut le faire Oracle par exemple). MySQL reste une version très "light" d'Oracle (un peu trop à mon goût), même si Oracle l'a amélioré depuis l'acquisition de Sun (auteur initial de MySQL) mais sans trop investir dessus. Le 5 décembre 2013 23:05, Frédéric Rodrigo a écrit : > Le 05/12/2013 22:51, François Lacombe a écrit : > > Bonsoir, >> >> Je souhaite savoir si dans le modèle de données retenu par OSM il est >> possible de retrouver des objets ne possédant pas certains tags. >> A partir d'Overpass API par exemple ? >> >> Dans OAPI, on peut tout a fait fixer une clause pour trouver des objets >> qui possèdent un tag défini avec n'importe quelle valeur mais en >> revanche le langage ne permet pas de définir le conjugué d'une telle >> contrainte. >> Est-ce un "oubli" ou une lacune profonde du modèle ? >> >> >> L'objet de
Re: [OSM-dev-fr] Trouver des objets ne possédant pas certains tags
Le jeudi 05 décembre 2013 22:51:12, François Lacombe a écrit : > Bonsoir, Bonsoir, > Je souhaite savoir si dans le modèle de données retenu par OSM il est > possible de retrouver des objets ne possédant pas certains tags. A supposer donc que ça soit théorique comme questionnement. C'est pas clair pour moi tout ça, de quel "modèle retenu par OSM" tu parles ? Celui des noeuds/ways/relation avec des tags ? Le modèle ne me semble pas empêcher ta demande, charge à celui qui veut le faire de trouver le bon format de stockage et le bon algo. Je dois pas bien comprendre la question... > Je cherche actuellement à mettre au point une requête SQL qui retrouve des > enregistrements qui ne possèdent pas certaines clés. Là, c'est du concret ? ou on est toujours dans les nuages du théorique ? Si tu veux te fixer sur l'utilisation de SQL (juste avant tu disais "avec overpass par exemple, mais overpass n'utilise pas SQL) il te reste à trouver un schéma (structure de base de donnée le permettant) Le schéma tout fait tout prêt avec convertisseur .osm -> sql de osm2pgsql te permet un truc genre : "select * from planet_osm_line where highway is NULL" ça te sort tous les chemins qui n'ont pas de tag highway -- sly (sylvain letuffe) http://wiki.openstreetmap.org/wiki/User:Sletuffe ___ dev-fr mailing list dev-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/dev-fr
Re: [OSM-dev-fr] Trouver des objets ne possédant pas certains tags
Bonsoir Ista, Frederic, Le 5 décembre 2013 23:04, Ista Pouss a écrit : > > > Pour l'overpass api c'est indiqué là : > http://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide#Negation > Non justement, le guide montre comment nier l'égalité (ou la ressemblance) une valeur donnée, mais pas la présence même d'un tag. Une clause du genre !["highway"] => Tous les objets qui ne possèdent pas "highway" en tag. Le 5 décembre 2013 23:05, Frédéric Rodrigo a écrit : > > Il faut utiliser un jointure externe ("left join" en sql) sur ton tag s'il > est dans une table de jointure ou IS NULL si c'est une colonne ou un > hstore... tu ne donnes pas le schéma que tu utilises... > Non je ne donne pas le modèle parce que je ne me serais pas permis d'utiliser cette liste pour un problème qui ne concerne pas OSM directement. Les tags sont bien dans une table de jointure (double jointure même, c'est une relation n:n). Le modèle est là, avec quelques détails sur le problème si certains souhaitent s'y pencher. http://www.developpez.net/forums/d1398546/bases-donnees/mysql/requetes/recherche-nulle-modele-eav/#post7601284 > Pourquoi OAPI ne le fait pas ? Sûrement parce que ça coute cher. Pour > trouver une données indexé il faut chercher dans l'index. Pour trouver une > absence de données, il faut regarder partout. > Je me faisais la réflexion que je n'avais pas vu beaucoup de systèmes implémenter cette fonctionnalité... et je voulais voir si OSM était l'exception qui confirme la règle. Cordialement, *François Lacombe* francois dot lacombe At telecom-bretagne dot eu http://www.infos-reseaux.com ___ dev-fr mailing list dev-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/dev-fr
Re: [OSM-dev-fr] Trouver des objets ne possédant pas certains tags
Le 5 décembre 2013 22:51, François Lacombe < francois.laco...@telecom-bretagne.eu> a écrit : > > Je souhaite savoir si dans le modèle de données retenu par OSM il est > possible de retrouver des objets ne possédant pas certains tags. > A partir d'Overpass API par exemple ? > > Pour l'overpass api c'est indiqué là : http://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide#Negation Cordialement. ___ dev-fr mailing list dev-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/dev-fr
Re: [OSM-dev-fr] Trouver des objets ne possédant pas certains tags
Le 05/12/2013 22:51, François Lacombe a écrit : Bonsoir, Je souhaite savoir si dans le modèle de données retenu par OSM il est possible de retrouver des objets ne possédant pas certains tags. A partir d'Overpass API par exemple ? Dans OAPI, on peut tout a fait fixer une clause pour trouver des objets qui possèdent un tag défini avec n'importe quelle valeur mais en revanche le langage ne permet pas de définir le conjugué d'une telle contrainte. Est-ce un "oubli" ou une lacune profonde du modèle ? L'objet de ma question ne trouve pas d'application concrète dans OSM. OSM utilise comme beaucoup d'autres systèmes une modélisation EAV pour le stockage des tags dans la base de données. Je cherche actuellement à mettre au point une requête SQL qui retrouve des enregistrements qui ne possèdent pas certaines clés. Merci par avance pour vos indications. Il faut utiliser un jointure externe ("left join" en sql) sur ton tag s'il est dans une table de jointure ou IS NULL si c'est une colonne ou un hstore... tu ne donnes pas le schéma que tu utilises... Pourquoi OAPI ne le fait pas ? Sûrement parce que ça coute cher. Pour trouver une données indexé il faut chercher dans l'index. Pour trouver une absence de données, il faut regarder partout. Frédéric. ___ dev-fr mailing list dev-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/dev-fr
[OSM-dev-fr] Trouver des objets ne possédant pas certains tags
Bonsoir, Je souhaite savoir si dans le modèle de données retenu par OSM il est possible de retrouver des objets ne possédant pas certains tags. A partir d'Overpass API par exemple ? Dans OAPI, on peut tout a fait fixer une clause pour trouver des objets qui possèdent un tag défini avec n'importe quelle valeur mais en revanche le langage ne permet pas de définir le conjugué d'une telle contrainte. Est-ce un "oubli" ou une lacune profonde du modèle ? L'objet de ma question ne trouve pas d'application concrète dans OSM. OSM utilise comme beaucoup d'autres systèmes une modélisation EAV pour le stockage des tags dans la base de données. Je cherche actuellement à mettre au point une requête SQL qui retrouve des enregistrements qui ne possèdent pas certaines clés. Merci par avance pour vos indications. *François Lacombe* francois dot lacombe At telecom-bretagne dot eu http://www.infos-reseaux.com ___ dev-fr mailing list dev-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/dev-fr