针对seq扫描优化PostgreSQL表

时间:2016-06-22 10:08:41

标签: performance postgresql database-design tablespace database-optimization

假设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页面缓存,并且所有表读数都可以从内存中发生。不同的存储类型(plainmainextended等)如何影响这些事情,我如何调整我的表格来优化它?

1 个答案:

答案 0 :(得分:1)

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

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