使用GROUPBY优化SQLite查询
我正在尝试优化使用GROUPBY的查询。但不能太长时间 我有一个包含3列的虚拟表:使用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
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子句中设置条件?”我不知道。。。谢谢你给我的第一个问题(只是没有做)帮我解决了。非常感谢。