Postgresql

PostgreSQL 從表中選擇(沒有 ORDER BY)每次都以不同的順序出現

  • July 26, 2022

我有一張大約一百萬行的大桌子。使用靜態 where 子句,它可以過濾到 200,000 行。使用典型的使用者搜尋標準,它提供大約 100 行。這是針對每小時訪問數百萬次的 Web 服務。我想讓數據庫負載盡可能小。所以買不起。但我需要能夠使用 OFFSET / LIMIT 子句滾動瀏覽結果集。然而,我有生以來第一次注意到,對於這個查詢,每次執行它時(在沒有其他活動的系統上),結果都會以不同的順序出現。我知道在 SQL 中不能保證任何特定的順序,但我習慣了當條件不變並且我們只使用 OFFSET 和 LIMIT 時順序至少是穩定的。

一開始我以為是並行查詢,但即使在我關閉它之後,單執行緒表掃描

Limit  (cost=0.00..316982.62 rows=25 width=471)
 ->  Seq Scan on mytable (cost=0.00..316982.62 rows=25 width=471) 
       Filter: ...

我想我不使用任何索引而只使用過濾器是一個壞主意。也許這就是這裡的異常。但即便如此,PostgreSQL 使用的特殊優化是什麼使其始終產生不同的結果?這似乎就是原因。

但無論如何,有沒有一種方法可以確保任何表掃描都使用相同的隨機但穩定的表掃描排序?

為什麼會這樣可能是由於synchronize_seqscans。現在去玩得開心,更有活力地拍自己的腳。

不,答案是肯定的。

只有一種方法可以確保一致和重複的順序。使用ORDER BY.

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