Postgresql

針對多個查詢的收集結果優化 LIMIT / OFFEST 的性能

  • August 1, 2018

我在 Postgres 10.4 中有大表(數百萬行)和三個管道SELECT查詢。每個行佔總結果的百分比SELECT大致為:

  • 選擇 1:~5% 行
  • 選擇 2:~5 % 行
  • 選擇 3:~90% 行

我可以使用UNIONandORDER BY和一RANK列,但它非常慢,因為 Postgres 從所有子查詢中收集行並應用於ORDER BY RANK結果集。

有沒有一種方法可以SELECT 1執行,並且只有在沒有提供足夠行SELECT 2的情況下才會執行,等等。

有一種通用技術可以實現這一點,使用UNION ALLand LIMIT

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 BYLIMIT 除了外部的嵌套周圍加上括號LIMIT

有關的:

引用自:https://dba.stackexchange.com/questions/213783