【问题标题】:select with subquery takes about 1min in sqlite and < 1s in SQL Server使用子查询选择在 sqlite 中大约需要 1 分钟,在 SQL Server 中需要 < 1s
【发布时间】:2010-02-21 23:03:31
【问题描述】:

我已经查看了很多关于这个问题的帖子(sqlite 中的子查询非常慢)。但是我对sql不是很擅长,我不知道我能做什么。

我有这个疑问:

SELECT * FROM data d WHERE d.category = 3 AND 
(SELECT COUNT(id) FROM data_tag WHERE data = d.id AND (tag = 2136 OR tag = 8)) >= 2 
ORDER BY id ASC

我有 3 张桌子 data,tag 和 data_tag (n-m 的数据和标签) 每个数据都有 n 个标签,在这个查询中,我按标签搜索数据(2 个标签,都必须在数据中)

我将我的数据库从 SQL Server 切换到 sqlite,除此查询外,一切正常。 在 SQL Server 中,这个执行时间不到 1 秒,在 sqlite 中大约需要 1 分钟。 请给我一些建议。

【问题讨论】:

  • SQLite 中data_tag 的索引是什么?

标签: sql sqlite


【解决方案1】:
SELECT d.* FROM data d
INNER JOIN data_tag ON data_tag.data = d.id AND (tag = 2136 OR tag = 8)
WHERE d.category = 3 
GROUP BY d.id
HAVING COUNT(data_tag.id) >= 2 
ORDER BY id ASC

【讨论】:

  • 确定SELECT *GROUP BY d.id 在一起吗?
  • 只是问。 ;) 不是很好的风格(IMO),但如果它有效的话。
  • +1:干得好,好家伙。请原谅我的迟到,票用完了。
【解决方案2】:

试试:

  SELECT d.* 
    FROM DATA d 
    JOIN (SELECT dt.data,
                 COUNT(id) AS num_tags
            FROM DATA_TAG dt
           WHERE dt.tag IN (2136, 8)
        GROUP BY dt.data
          HAVING COUNT(id) >= 2) x ON x.data = d.id
ORDER BY d.id 

在 ORDER BY 中不需要 ASC - 这是默认设置。

【讨论】:

  • 无需选择COUNT(id),因为您不会在任何地方使用它。也不确定 SQLite 是否可以将索引投影到临时表中,真正的连接可能会更好。
  • @Tomalak:是的,后来我更正了列别名时才意识到。不应该对事情产生负面影响
  • 是的,只有一行代码,不多。如果索引工作更有趣。
  • 感谢您的回答,它工作正常,但 codeholic 的查询执行时间更快:31.25ms
猜你喜欢
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2016-01-05
  • 2014-01-01
  • 2016-04-05
相关资源
最近更新 更多