2011-05-04 34 views
1

嗯,我有一個按ID排序表,但我想檢索n行偏移m行,但是當我使用它沒有orderby它正在產生不可預知的結果,並通過ID順序它需要太多的時間,因爲我的表已經排序,我只想檢索n行,留下第m行。限制和偏移量在sql中的問題?

+7

*因爲我的表已經訂購*。一張表是無序的一組行。除非您指定Order By,否則數據庫不能保證行的種類。因此,沒有「我的餐桌已經訂購」的概念。你不能假定,當你查詢你的表時,即使給定了相同的查詢,它也會按照特定的順序,除非你使用了Order By。 – Thomas 2011-05-04 19:10:27

回答

1
SELECT * FROM mytable LIMIT 100 OFFSET 0 

儘管如此,您確實不應該依賴隱式排序,因爲您可能無法預測數據如何進入數據庫的確切順序。

1

如上所述,除非您有ORDER BY子句,否則SQL不保證順序。在這種情況下LIMIT仍然有用,但我想不出任何用於OFFSET的情況。這聽起來像你沒有索引ID,因爲如果你這樣做,查詢應該是非常快,聚類或不。再看看那個。 (另請檢查CLUSTER,這可能會提高您的性能。)

REPEAT:這不是關於Postgresql的。它在這裏的行爲是一致的。

2

documentation說:

的查詢規劃考慮LIMIT生成查詢規劃的時候,所以你很可能得到不同的規劃(產生不同的行順序),這取決於你用什麼LIMIT和抵消。因此,使用不同的LIMIT/OFFSET值來選擇查詢結果的不同子集將導致不一致的結果,除非您使用ORDER BY強制執行可預測的結果排序。這不是一個錯誤;這是事實的一個內在結果,即SQL不承諾以任何特定順序傳遞查詢的結果,除非ORDER BY用於約束訂單。

所以你正在嘗試不能真正做到。

我想你可以玩規劃選項或者以一種聰明的方式重新排列查詢來誘使規劃人員使用適合你的計劃,但實際上不顯示查詢,這很難說。