最近我對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