Мне все еще неясно, что вы пытаетесь получить с точки зрения результатов, но вы можете значительно сократить размер базы данных и ускорить запросы, выполнив некоторую базовую очистку, например, используя целые числа вместо строк для * 1001.* распределительная таблица .(Целые числа занимают меньше места и на лот сравниваются быстрее, чем строки, поэтому вы хотите максимально использовать их для отношений)
Сначала создайте столбец INTEGER PRIMARY KEY
ваша таблица узлов для псевдонима rowid :
CREATE TABLE nodes(id INTEGER PRIMARY KEY
, name TEXT NOT NULL UNIQUE
, address TEXT);
INSERT INTO nodes(name, address) VALUES
('google', 'google.com')
, ('MSN', 'microsoft.com');
-- etc.
(я предполагаю, что имена уникальны; в противном случае вы захотите внести соответствующие изменения и добавить нормальный индекс для столбца(edit: я подозреваю, что у вас нет индекса на nodes.name
, который помог бы объяснить действительно медленный запрос)).
Затем сделайте так, чтобы ваша таблица ребер ссылалась на столбец id вместо имени (такжепри условии, что каждая пара (source,dest)
уникальна):
CREATE TABLE edges(source INTEGER REFERENCES nodes(id)
, dest INTEGER REFERENCES nodes(id)
, PRIMARY KEY(source, dest)) WITHOUT ROWID;
INSERT INTO edges(source, dest) VALUES
((SELECT id FROM nodes WHERE name='MSN'), (SELECT id FROM nodes WHERE name='google'))
, ((SELECT id FROM nodes WHERE name='google'), (SELECT id FROM nodes WHERE name='MSN'));
-- etc.
( Документация для БЕЗ ROWID , если вы никогда этого не видели.)
Тогда запрос вваш вопрос станет примерно таким:
SELECT *
FROM edges AS e
JOIN nodes AS n ON e.source = n.id OR e.dest = n.id