考虑以下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个匹配就不会终止?
你有一个DISTINCT.这意味着要查找10个不同的行,必须扫描与谓词匹配的所有行,直到找到10个不同的 some_fields.
根据您的索引,查询优化器可能会决定扫描所有行是执行此操作的最佳方法.
10个不同的行可以代表10,一百万,无限的非不同行.