Postgresql
針對多個查詢的收集結果優化 LIMIT / OFFEST 的性能
我在 Postgres 10.4 中有大表(數百萬行)和三個管道
SELECT
查詢。每個行佔總結果的百分比SELECT
大致為:
- 選擇 1:~5% 行
- 選擇 2:~5 % 行
- 選擇 3:~90% 行
我可以使用
UNION
andORDER BY
和一RANK
列,但它非常慢,因為 Postgres 從所有子查詢中收集行並應用於ORDER BY RANK
結果集。有沒有一種方法可以
SELECT 1
執行,並且只有在沒有提供足夠行SELECT 2
的情況下才會執行,等等。
有一種通用技術可以實現這一點,使用
UNION ALL
andLIMIT
:SELECT 1 ... UNION ALL SELECT 2 ... UNION ALL SELECT 3 ... LIMIT N;
Postgres 按順序計算嵌套
SELECT
的 s 並在返回足夠的行後立即停止。其餘的永遠不會被執行。這種優化不會發生在外部
ORDER BY
,它會強制 Postgres在應用LIMIT
. 它也不適用於UNION
(而不是UNION ALL
),它在刪除重複項之前也會考慮所有行,最後是LIMIT
.
SELECT
您需要在每個具有ORDER BY
或LIMIT
除了外部的嵌套周圍加上括號LIMIT
。有關的: