【问题标题】:How is SELECT DISTINCT so fast? [duplicate]SELECT DISTINCT 怎么这么快? [复制]
【发布时间】:2010-12-28 08:21:12
【问题描述】:

可能重复:
SQL — How is DISTINCT so fast without an index?

嗨,

我有一个数据库,其中有一个名为“links”的表,在 SQLite 中有 6 亿行。数据库中有 2 列 - “src”列和“dest”列。目前没有索引。

在 src 和 dest 之间有相当数量的公共值,但也有相当数量的重复行。

我要做的第一件事是删除所有重复的行,然后对结果进行一些额外的处理,但是我遇到了一些奇怪的问题。

首先,SELECT * FROM links WHERE src=434923 AND dest=5010182。现在这会很快返回一个结果,然后需要很长时间才能运行,因为我假设它正在对其余 600m 行执行表扫描。

但是,如果我执行 SELECT DISTINCT * FROM 链接,那么它会立即开始快速返回行。问题是:这怎么可能?当然,对于每一行,该行都必须与表中的所有其他行进行比较,但这需要对表中剩余的行进行表扫描,这应该需要很长时间!

知道为什么 SELECT DISTINCT 比标准 SELECT 快得多吗?

【问题讨论】:

  • 你为什么又问完全相同的问题,而且来自两个同名的不同帐户???
  • 老实说,我不知道。我之前尝试过发布问题,但这里的服务器出现错误。然后我试图找到原始问题,但它没有在我的帐户下注册(它仍然没有)并搜索它(找不到它)所以我认为它没有发布。为错误道歉。

标签: database optimization sqlite


【解决方案1】:

重复的问题需要重复的答案:

更准确地说,一个查询并不比另一个快。更准确地说,查询完成所用的时间对于两个查询应该是相同的。不同之处在于,带有 DISTINCT 的查询只需返回更多行,因此它似乎响应更快,因为您正在快速接收行。然而,两者背后发生的是同一个表扫描。 distinct 查询有一个数据结构,用于存储返回的内容并过滤重复项。因此,实际上应该需要更长的时间才能完成查询,但是(返回的行数)/时间更大,因为匹配的行数更多。 (另请注意:一些查看器添加了查询结果限制,这可以使不同的查询看起来运行得更快(因为您达到了结果限制并停止)。

【讨论】:

  • 为重复的道歉,一个诚实的错误(请参阅我上面的评论)。感谢您的帮助,非常感谢。
猜你喜欢
  • 2023-04-08
  • 2020-12-19
  • 2011-06-02
  • 2012-03-18
  • 2012-03-30
  • 2014-05-09
  • 2016-03-19
  • 2012-09-19
  • 2010-09-13
相关资源
最近更新 更多