为 seq 扫描优化 PostgreSQL table

Optimize PostgreSQL table for seq scans

假设PostgreSQL数据库中有一个table:

\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 列。 是否可以以某种方式优化 table 在磁盘上的存储?例如,如果我有很多 seq scans 而不是这样的 table,那么尽可能多地 localized 布局听起来是合理的 table .此外,较小的 table 大小 可以有效地使用 OS 页面缓存,并且所有 table 读数都可以从内存中进行。不同的存储类型(plainmainextended 等)对这些事情有何影响,我该如何调整我的 table 来优化它?

要加快顺序扫描,请使用快速存储和大量内存。
您可以使用 pg_prewarm 将 table 加载到 PostgreSQL 的共享缓冲区缓存中,这将大大加快顺序扫描的速度。

就是说,既然您问的是 TOAST,唯一可能被离线存储的列是 extra,因为它是唯一可以增长到足够大的列。
只要您不 select TOAST 列,TOAST 实际上可以加速顺序扫描,因为在这种情况下甚至不会从磁盘读取值。
它不会帮助你SELECT * FROM game_user