考虑以下pgSQL的语句:为什么SQL语句在“有限”时间太长?
SELECT DISTINCT some_field
FROM some_table
WHERE some_field LIKE 'text%'
LIMIT 10;
想想也是,那some_table由几百万条记录,并some_field有一个B树索引。
为什么查询需要很长时间才能执行(几分钟)?我的意思是,为什么不通过创建结果集来循环,一旦获得10个结果集,返回结果?无论您是否包含“LIMIT 10”,执行时间看起来都是一样的。
这是正确的还是我错过了什么?有什么我可以做,让它返回前10个结果,'拧'其余的?
更新:如果删除不同的结果,结果几乎是瞬间返回。不过,我知道许多some_table记录已经相当独特,并且在我运行查询而没有明确声明的情况下,前10个结果实际上是唯一的。我也删除了where子句(将其作为一个因子)。所以,我原来的问题仍然存在,为什么只要找到10场比赛就不会终止?
我认为没有ORDER BY会加快速度。如果您有ORDER BY,则数据库需要返回十个“最低”行,这涉及到排序或所有行(或巧妙使用排序列上的索引)。现在只需要返回找到的前十个(不同的)行。 – Thilo 2009-04-27 02:22:02
这不一定是正确的。例如,我相信这是postgres 8.2或8.3中的一项新功能。其他dbms的支持这种优化可能会有所不同。 – 2009-04-27 02:27:57