как оптимизировать соединение (по тексту) с FTS3 - PullRequest
0 голосов
/ 25 сентября 2018
  1. Доза Функциональность FTS3 работает быстро с объединениями JOIN?
  2. , если она дозируется, подскажите, как конвертировать мои таблицы.У меня есть 2 таблицы с миллионами записей (ребер и узлов).Я должен присоединиться к ним на 2 столбца, в котором содержимое столбцов является текстом.основной рабочий запрос (но медленный):

    select * from EDGES
    inner join NODES on EDGES.sourcename = NODES.name
    or EDGES.targetname = NODES.name
    
  3. , если нет, есть ли более быстрый способ получить результат?база данных составляет 15 ГБ, и этот запрос может занять более 2 дней.

таблицы похожи на

Узлы, представляющие интерес для всех узлов:

name        address
---------------------
yahoo       yahoo.com
google      google.com
MSN         MSN.com

Все ребра

sourcename     targetname 
--------------------------
MSN            google
yahoo          google
google         MSN
amazon         google
amazon         yahoo
yahoo          amazon
amazon         stackoverflow
stackoverflow  amazon
MSN            amazon

результат может выглядеть следующим образом:

sourcename     targetname 
--------------------------
MSN            google
yahoo          google
google         MSN
amazon         google
amazon         yahoo
yahoo          amazon
MSN            amazon

1 Ответ

0 голосов
/ 25 сентября 2018

Мне все еще неясно, что вы пытаетесь получить с точки зрения результатов, но вы можете значительно сократить размер базы данных и ускорить запросы, выполнив некоторую базовую очистку, например, используя целые числа вместо строк для * 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...