假设PostgreSQL数据库中有一个表:
\d+ game_user
Table "public.game_user"
Column | Type | Modifiers | Storage
----------+----------------+-------------------------------------------------+---------
id | bigint | not null default nextval('gu_id_seq'::regclass) | plain
created | timestamptimez | not null default now() | plain
modified | timestamptz | not null default now() | plain
status | smallint | not null default 1 | plain
user_id | bigint | not null | plain
game_id | bigint | not null | plain
referrer | varchar(128) | default NULL::character varying | extended
extra | json | default '{}'::json | extended
nickname | varchar(32) | default NULL::character varying | extended
这里看起来很有趣的是Storage
列。
是否有可能以某种方式优化磁盘上表的存储?例如,如果我在这样的表上有很多seq scans
,那么尽可能多地使用表的本地化布局是合理的。此外,拥有较小的表大小可以有效地使用OS页面缓存,并且所有表读数都可以从内存中发生。不同的存储类型(plain
,main
,extended
等)如何影响这些事情,我如何调整我的表格来优化它?
答案 0 :(得分:1)
要加快顺序扫描,请使用快速存储和大量内存 您可以使用pg_prewarm将表加载到PostgreSQL的共享缓冲区缓存中,这将大大加快顺序扫描速度。
那就是说,既然你问TOAST,那么可能存储在线外的唯一一列是extra
,因为它是唯一一个可以增长到足够大的列。
只要您没有选择TOASTed列,TOAST实际上可以加速顺序扫描,因为在这种情况下甚至不会从磁盘读取该值。
它对SELECT * FROM game_user
没有帮助。