为 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 读数都可以从内存中进行。不同的存储类型(plain
、main
、extended
等)对这些事情有何影响,我该如何调整我的 table 来优化它?
要加快顺序扫描,请使用快速存储和大量内存。
您可以使用 pg_prewarm 将 table 加载到 PostgreSQL 的共享缓冲区缓存中,这将大大加快顺序扫描的速度。
就是说,既然您问的是 TOAST,唯一可能被离线存储的列是 extra
,因为它是唯一可以增长到足够大的列。
只要您不 select TOAST 列,TOAST 实际上可以加速顺序扫描,因为在这种情况下甚至不会从磁盘读取值。
它不会帮助你SELECT * FROM game_user
。
假设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 读数都可以从内存中进行。不同的存储类型(plain
、main
、extended
等)对这些事情有何影响,我该如何调整我的 table 来优化它?
要加快顺序扫描,请使用快速存储和大量内存。
您可以使用 pg_prewarm 将 table 加载到 PostgreSQL 的共享缓冲区缓存中,这将大大加快顺序扫描的速度。
就是说,既然您问的是 TOAST,唯一可能被离线存储的列是 extra
,因为它是唯一可以增长到足够大的列。
只要您不 select TOAST 列,TOAST 实际上可以加速顺序扫描,因为在这种情况下甚至不会从磁盘读取值。
它不会帮助你SELECT * FROM game_user
。