2010-11-01 4 views
3

J'ai une base de données de noeuds et de chemins. Une voie contient deux ou plusieurs nœuds. Certains nœuds appartiennent à plusieurs façons, et sont donc appelés une «jointure» entre deux ou plusieurs façons. J'essaie de trouver tous les nœuds qui se joignent deux ou plusieurs façons. J'utilise donc cette requête,Optimisation d'une requête de jointure de noeud

SELECT * 
FROM way_nodes wl 
JOIN way_nodes wr 
ON wr.node_id = wl.node_id AND wr.way_id != wl.way_id 

La table way_nodes contient la liste des nœuds de chaque façon.

Cependant, il est horriblement lent sur ma base de données avec 9,021 voies et 43,706 nœuds, et ne me donne que 20-30 nœuds par seconde. Au début, j'ai essayé de tenir compte du nombre de fois qu'un nœud est utilisé, mais cela prend encore beaucoup de temps. J'utilise SQLite3, mais je suspecte que mon problème s'applique à toutes les bases de données. Comment une telle requête serait-elle optimisée?

+0

Est-ce que je comprends bien cette requête? Trouver des nœuds qui partagent le nodeID mais pas le way_id? –

+0

Trouvez way_nodes partageant le même id_noeud. Le but est d'obtenir les deux way_id différents. way_nodes contient un node_id et un way_id. –

+0

Est-il plus rapide ou plus lent lorsque vous l'exécutez avec la clause join de juste "wr.node_id = wl.node_id" –

Répondre

1

Une façon plus simple de trouver de trouver tous les nœuds qui rejoignent deux façons ou plus serait de compter les façons distinctes par nœud - comme ceci:

SELECT node_id, count(distinct way_id) 
FROM way_nodes 
GROUP BY node_id 
HAVING count(distinct way_id) > 1 
+0

Merci, je vais essayer ça. –

+0

Wow, c'est quelque chose comme 10000x plus rapide, ça se termine en moins d'une seconde! Merci!! –

1

Avez-vous créé des index?

+0

Oui, les index créés le cas échéant. –

+0

@Thomas O: sur quels champs? –

+0

Sur tous les champs mentionnés dans la requête. –