【问题标题】:Optimize SQLite Query using GROUP BY使用 GROUP BY 优化 SQLite 查询
【发布时间】:2020-08-23 21:21:55
【问题描述】:

我正在尝试优化使用 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,因为我听说它通常更快但不能真正成功。任何建议都会有所帮助!

【问题讨论】:

    标签: sql sqlite group-by


    【解决方案1】:

    为什么选择在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
    

    【讨论】:

    • "为什么选择在 HAVING 子句中设置条件?"这个我不知道......谢谢你向我展示的第一个查询(只是没有做HAVING)为我解决了它。谢谢。
    【解决方案2】:

    您可以更改having 子句:

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

    如果match 在having 中不起作用,我建议:

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

    【讨论】:

    • 谢谢!我无法在 sum() 中获得足够有趣的匹配工作,但如果我确实使用 LIKE,它的工作速度非常快。虽然这里似乎 FTS5 不支持匹配。
    • @mpj 。 . .我想知道这是否可行。我添加了一个替代方案。这方面的表现如何?
    猜你喜欢
    • 2011-08-29
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多