2010-11-01 4 views
3

У меня есть база данных узлов и способов. Способ содержит два или более узлов. Некоторые узлы принадлежат нескольким путям и поэтому называются «соединением» между двумя или несколькими способами.Оптимизация запроса соединения узла

Я пытаюсь найти все узлы, которые соединяют два или более способов. Поэтому я использую этот запрос,

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

В таблице way_nodes содержится список узлов по каждому пути.

Однако, это ужасно медленно в моей базе данных с 9,021 способами и 43,706 узлами и дает мне только 20-30 узлов в секунду.

Первоначально я попытался сохранить количество раз, когда используется узел, но это все еще занимает много времени.

Я использую SQLite3, но я подозреваю, что моя проблема относится ко всем базам данных. Как оптимизировать такой запрос?

+0

ли я понимаю, этот запрос правильно? Найти узлы, которые совместно используют nodeID, но не way_id? –

+0

Найти way_nodes, используя один и тот же node_id. Цель состоит в том, чтобы получить два разных метода way_id. way_nodes содержит node_id и way_id. –

+0

Быстрее или медленнее, когда вы запускаете его с предложением join только «wr.node_id = wl.node_id» –

ответ

1

Более простой способ найти, чтобы найти все узлы, которые включаются два или более способов было бы считать различные пути для каждого узла - например, так:

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

Спасибо, я попробую это. –

+0

Ничего себе, это что-то вроде 10000x быстрее, оно завершается в течение секунды! Благодаря!! –

1

Вы создали индексы?

+0

Да, индексы создаются там, где это необходимо. –

+0

@Thomas O: на каких полях? –

+0

По всем полям, указанным в запросе. –