[pgsql-jp: 41883] Re: 1行のサイズが2KBを超えたときの性能について
michio.kataoka.pmb @ rand.co.jp
michio.kataoka.pmb @ rand.co.jp
2016年 8月 4日 (木) 13:19:44 JST
#管理者様、再投稿しましたので承認待ちのものは削除下さい。
JPUG高塚 様
ご回答ありがとうございます。片岡です。
Let's Postgresのページ、とても有り難く読ませていただいています、
中の人にご回答いただけて光栄です!
2KBはTOASTと行内カラムに纏わるお話だったのですね。
なんとなくわかってきた気がします。
・TOASTが効くので、varchar(N) や numeric などで2KBを超えても問題ない。
ただし、TOASTされない行内カラムはそのまま行のサイズを増やしてしまう。
・1行当たり8KBを超えると保存できなくなる。
・TOASTされた行が全テーブル通算40億に近づくと著しい速度低下を引き起こす。
( https://wiki.postgresql.org/wiki/TOAST/ja )
・行が2KBに収まっていればTOASTが使われないので40億行の制限はない。
Let's Postgresにある「極端に性能が落ちる場合」について、
TOASTのカウンタ(OID)の最大値にまつわるものだと理解しました。
40億って4byteでしょうか、もうすこし多くてもいい気がしますが
検索してもあまりこのお話し出てきませんし、
回避方法もいくつかあるので実用上問題無いんでしょうね。。
----- Original Message -----
>
> JPUG高塚です。
>
> # Letsのメンテナンスもしています
>
>
> > 「PostgreSQL では1行のサイズが 2KB を超えると、極端に性能が落ちる場
合が
> > あります。」
>
> 上記は行内カラムのことですね。(id int, dat varchar(2500)) みたいな
> テーブルなら TOAST が効くし、行内カラム長は短いので大丈夫です。
>
> さて、TOAST を使うかの判断には 1行サイズ 2KB という基準も使われますが、
> 一方でその対象は varchar(N) や numeric のような可変長型に限られます。
> interval型(16バイト) × 150カラム は 2KB を超えますが、TOAST は
> 使われません。
>
> 行内カラムで1行分のデータがページサイズを超えると、そもそも格納
> できません。INSERT や UDPATE でエラーになります。ページを跨げないので
す。
>
> ということで、8KB のページに 2.1KB の行を投入すると、1ページに
> 3件だけ格納となりまして、いかにも効率が悪くなりそうではありませんか。
>
> あるいは 2KB を超える行データ中に TOAST可能なものが含まれていて、
> 一部 TOASTに廻しても、結局行内カラム1行が 1KBくらいになったなら、
> これでも十分効率が悪そうです。
>
>
>
>
> On Tue, 02 Aug 2016 18:47:51 +0900
> <michio.kataoka.pmb @ rand.co.jp> wrote:
>
> > 片岡と申します。
> >
> > こちらでお聞きすることではないかもなのですが、
> > Let's Postgres のチューニングのページ
> > http://lets.postgresql.jp/map/tuning に
> >
> > 「PostgreSQL では1行のサイズが 2KB を超えると、極端に性能が落ちる場
合が
> > あります。」
> > との記述があります。
> >
> > テーブルのブロックサイズは8KBなので2KBだったらブロック内に収まります
し、
> > TOASTが使われるのは行内のカラムの値が2KBを超えた場合だと説明されてい
たの
> > で
> > ちょっとニュアンスが異なるように思います。
> >
> > 性能が落ちる理由を調べていたのですが、これだと思えるものを見つけられ
ませ
> > んでした。
> >
> > Let's Postgresの説明の「極端に」とはどの程度なのか、
> > また「落ちる場合がある」とはどのような場合なのか、
> > お教えいただけないでしょうか。
> >
> >
> > よろしくお願い致します。
>
>
>
> ______________________________________________________________________
> 日本PostgreSQLユーザ会 高塚 遙 http://www.postgresql.jp
>
>
pgsql-jp メーリングリストの案内