为什么SQL语句在"有限"时需要这么长时间?

Ash*_*Ash 1 sql postgresql

考虑以下pgSQL语句:

SELECT DISTINCT some_field 
  FROM some_table 
  WHERE some_field LIKE 'text%' 
  LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

还要考虑some_table包含数百万条记录,some_field具有b树索引.

为什么查询执行这么长时间(几分钟)?我的意思是,为什么它不通过创建结果集循环,一旦它得到10个,返回结果?无论您是否包含"限制10",看起来执行时间都是相同的.

这是正确的还是我错过了什么?有什么我可以做的,让它返回前10个结果并"拧"其余的?

更新:如果你删除了distinct,结果几乎立即返回.但我确实知道,许多some_table记录已经相当独特,而且当我在没有明确声明的情况下运行查询时,前10个结果实际上是唯一的.我也删除了where子句(将其作为一个因素消除).所以,我原来的问题仍然存在,为什么一旦找到10个匹配就不会终止?

tpd*_*pdi 8

你有一个DISTINCT.这意味着要查找10个不同的行,必须扫描与谓词匹配的所有行,直到找到10个不同的 some_fields.

根据您的索引,查询优化器可能会决定扫描所有行是执行此操作的最佳方法.

10个不同的行可以代表10,一百万,无限的非不同行.