最近我对Clojure很熟悉,我对懒惰序列评估的想法感到好笑,它只在必要时计算值。LIMIT优化查询
我使用PostgreSQL数据库工作了很多,并且在使用LIMIT子句时遇到了不同的查询性能。例如查询
SELECT * FROM(
SELECT id FROM foo1
INTERSECT
SELECT id FROM foo2) AS subquery
LIMIT 50
将具有相同的执行时间像
SELECT id FROM foo1
INTERSECT
SELECT id FROM foo2.
这表明Postgres的首先评估整个结果,然后就拿到前50行。这种行为与懒惰的想法相反,因为数据库过程数据不需要得到最终答案。但在另一方面查询
SELECT * FROM foo1 INNER JOIN foo2 ON foo1.id=foo2.id LIMIT 50
性能比
SELECT * FROM foo1 INNER JOIN foo2 ON foo1.id=foo2.id.
好得多是否有人知道哪个Postgres的操作支持这样的限制懒惰?
注:'LIMIT'没有'ORDER BY'很少或没有意义。 – wildplasser 2014-12-27 19:23:50
有关查询计划或性能的问题,请总是***包括您的Postgres版本和您的案例的确切表格定义。阅读['[postgresql-performance]'](http://stackoverflow.com/tags/postgresql-performance/info)的标签信息。索引和约束特别相关。 – 2014-12-28 00:13:47
@wildplasser:只要一个*任意*选择是好的,'LIMIT'可以在没有ORDER BY的情况下使用。尽管如此,许多新手并没有意识到细节,所以我们在SO上看到大多数不正确的查询就像这个问题。 – 2014-12-28 01:25:57