8

postgresに次のクエリがあります:

SELECT * 
FROM "bookings"
WHERE ("bookings".client_id = 50) 
ORDER BY session_time DESC 
LIMIT 20 OFFSET 0

20位のレコードは、21位のレコードと同じsession_timeを持っています。

このクエリは20の結果を返しますが、結果をデータベース全体と比較すると、クエリは1番目から19番目の結果と21番目の結果を返し、20番目をスキップします。

このクエリは、注文に「id」を追加することで修正できます。

SELECT * 
FROM "bookings" 
WHERE ("bookings".client_id = 50) 
ORDER BY session_time DESC, id 
LIMIT 20 OFFSET 0

しかし、私はこのバグがどのように発生したのか疑問に思いましたか?オフセットと制限を使用する場合、postgresはどのように同一のファイルを注文しますか?ランダムですか?postgresのバグですか?

4

1 に答える 1

10

これはバグではありません。制限とオフセットは順序付け後に発生し、あるケースと別のケースでどの行が選択されるかは決定論的ではありません。一般に、順序が安定して決定論的であるようにタイブレーカーが必要です(クエリが実行されるたびに同じであることを保証するために、制限やオフセットの問題がない場合でも、一意のタイブレーカーを使用することを好みます)。

ページネーションを行っている場合は、主キーまたは代理キーをタイブレーカーとして並べ替えに追加します。それが本当に最善の方法です。

于 2013-04-06T16:09:13.883 に答える