使用GROUPBY优化SQLite查询

使用GROUPBY优化SQLite查询,sql,sqlite,group-by,Sql,Sqlite,Group By,我正在尝试优化使用GROUPBY的查询。但不能太长时间 我有一个包含3列的虚拟表: CREATE VIRTUAL TABLE GoiWordsWithSeq USING FTS5(idseq,sid,body); 我希望组与下面的查询一样,但运行起来有点太长了。 例如,我首先尝试了这个方法,效果很好,但我仍然想知道我是否可以使它更快: select GROUP_CONCAT(body), sid from GoiWordsWithSeq GROUP BY sid HAVING sid IN

我正在尝试优化使用GROUPBY的查询。但不能太长时间

我有一个包含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'
)
然后:


但查询仍然需要很长时间。我正在尝试使用JOIN,因为我听说它通常更快,但无法真正成功。任何建议都会有帮助

您可以更改
having
子句:

select GROUP_CONCAT(body), sid
from GoiWordsWithSeq
GROUP BY sid
having sum( GoiWordsWithSeq.body match 'awesome' ) > 0;
如果
match
have
中不起作用,我建议设置:

select GROUP_CONCAT(body), sid
from (select g.*, (GoiWordsWithSeq.body match 'awesome') as flag
      from GoiWordsWithSeq
     ) g
group sid
having sum( flag ) > 0;

您可以更改
having
子句:

select GROUP_CONCAT(body), sid
from GoiWordsWithSeq
GROUP BY sid
having sum( GoiWordsWithSeq.body match 'awesome' ) > 0;
如果
match
have
中不起作用,我建议设置:

select GROUP_CONCAT(body), sid
from (select g.*, (GoiWordsWithSeq.body match 'awesome') as flag
      from GoiWordsWithSeq
     ) g
group sid
having sum( flag ) > 0;

为什么选择在
HAVING
子句中设置条件?
在所有聚合完成后,使用您的代码检查条件。
您的条件不涉及任何聚合列,因此没有理由在
HAVING
子句中使用它。
WHERE
子句中设置它会更有意义,这样数据集将被过滤,然后
groupby
将被应用于聚合:

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

为什么选择在
HAVING
子句中设置条件?
在所有聚合完成后,使用您的代码检查条件。
您的条件不涉及任何聚合列,因此没有理由在
HAVING
子句中使用它。
WHERE
子句中设置它会更有意义,这样数据集将被过滤,然后
groupby
将被应用于聚合:

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

非常感谢。但是,如果我确实使用LIKE,sum()的匹配工作就不够有趣了,因为它运行得非常快。虽然FTS5似乎不支持这里的匹配。@mpj。我想知道这是否行得通。我添加了一个替代方案。那场演出怎么样?谢谢!但是,如果我确实使用LIKE,sum()的匹配工作就不够有趣了,因为它运行得非常快。虽然FTS5似乎不支持这里的匹配。@mpj。我想知道这是否行得通。我添加了一个替代方案。这方面的表现如何?“你为什么选择在HAVING子句中设置条件?”我不知道。。。谢谢你给我的第一个问题(只是没有做)帮我解决了。谢谢。“你为什么选择在HAVING子句中设置条件?”我不知道。。。谢谢你给我的第一个问题(只是没有做)帮我解决了。非常感谢。