[pgsql-jp: 41881] Re: 1行のサイズが2KBを超えたときの性能について

TAKATSUKA Haruka harukat @ postgresql.jp
2016年 8月 2日 (火) 19:35:25 JST


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 メーリングリストの案内