c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

PostgresqlのLIMITとOFFSETは結構ショボい

ポスグレはリミットとオフセットがあるので、数百万件のレコードでも、数千件づつとればwhereに何もはいってなくても安全に取れる。

というのは実はムリ。


実際にはLIMIT+OFFSETの件数をバッファに溜め込んでいるらしい。
私の環境ではOFFSETが100万を超えた辺りからLIMIT 1でも引っ張るのに何分も掛かる様に…。

残念ながら内部で頭の良いことはやっていないみたいです。
Where無しでLIMIT OFFSETだけを使って処理するのは無謀と言う事で。


いやまあ…この仕様は想像してたけど、一点を超えると指数関数的に重くなるね。

  • -

んー
A B
000 000001
000 000002
: :
・ ・
001 001999
002 002001
: :
・ ・
といったデータが有るとき、

select * from table_name where A = '000000' order by a,bLIMIT 1 OFFSET 1;
より
select * from table_name where B < '000999' and B > '000000' order by a,bLIMIT 1 OFFSET 1;
の方が断然に速いのは何故だろう(下は瞬間、上は1分近く掛かる)。レンジ的な検索の方が速いの?良くわからない。
というか、LIMIT1 OFFSET1なのになんで上は返事が何秒もかかる?ORDERの所為なんだろうが、ORDER外しても遅かった。

もしかしたらこれは当然なのかもしれないが…。
DBについて真面目に勉強していない俺はこういう実体験に基づく知識ばかりが増えてゆくのだった、問題にならないと気付かないなんてダメですね。