Оптимизация запроса на соединение узлов - PullRequest
3 голосов
/ 02 ноября 2010

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

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

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, но я подозреваю, что моя проблема относится ко всем базам данных. Как оптимизировать такой запрос?

Ответы [ 2 ]

1 голос
/ 02 ноября 2010

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

SELECT node_id, count(distinct way_id)
FROM way_nodes
GROUP BY node_id
HAVING count(distinct way_id) > 1
1 голос
/ 02 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...