Оптимизируйте запрос SQLite с помощью GROUP BY - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь оптимизировать свой запрос, в котором используется GROUP BY. Но разве это не займет слишком много времени.

У меня есть виртуальная таблица, которая содержит 3 столбца:

CREATE VIRTUAL TABLE GoiWordsWithSeq
USING FTS5(idseq,sid,body);

Я хочу, чтобы группа была такой же, как в запросе ниже, но это просто бегать слишком долго. Например, я сначала попробовал это, и он работает довольно хорошо, но все же мне интересно, смогу ли я сделать это быстрее:

select 
GROUP_CONCAT(body), sid
from GoiWordsWithSeq
GROUP BY sid
HAVING sid IN (
select sid from GoiWordsWithSeq
where GoiWordsWithSeq.body match 'awesome'
)

Затем:

  select 
    GROUP_CONCAT(body), GoiWordsWithSeq.sid
    from GoiWordsWithSeq
    inner join  (
    select sid from GoiWordsWithSeq
    where GoiWordsWithSeq.body match 'awesome'
    ) GoiMatch ON GoiMatch.sid = GoiWordsWithSeq.sid 

    GROUP BY GoiWordsWithSeq.sid

Но запрос по-прежнему занимает много времени. Я пытаюсь использовать JOIN, потому что я слышал, что это обычно быстрее, но на самом деле не удается. Любой совет поможет!

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Почему вы решили установить условие в предложении HAVING? С вашим кодом условие проверяется после завершения всех агрегатов. В вашем условии нет агрегированных столбцов, поэтому нет причин использовать его в предложении HAVING. Было бы разумнее установить его в предложении WHERE, чтобы набор данных фильтровался, а затем GROUP BY применялся для агрегирования:

SELECT GROUP_CONCAT(body), sid
FROM GoiWordsWithSeq
WHERE sid IN (
  SELECT sid FROM GoiWordsWithSeq
  WHERE body MATCH 'awesome'
)
GROUP BY sid

Вы также можете попробовать EXISTS, который иногда работает лучше:

SELECT GROUP_CONCAT(g.body), g.sid
FROM GoiWordsWithSeq g
WHERE EXISTS (
  SELECT 1 FROM GoiWordsWithSeq
  WHERE sid = g.sid AND body MATCH 'awesome'
)
GROUP BY g.sid
1 голос
/ 08 мая 2020

Вы можете изменить предложение having:

select GROUP_CONCAT(body), sid
from GoiWordsWithSeq
GROUP BY sid
having sum( GoiWordsWithSeq.body match 'awesome' ) > 0;

Если match не работает в having, я бы suggeset:

select GROUP_CONCAT(body), sid
from (select g.*, (GoiWordsWithSeq.body match 'awesome') as flag
      from GoiWordsWithSeq
     ) g
group sid
having sum( flag ) > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...