存储参数 (也称为“relopts”、“reloptions”或“relation options”) 是关系特定的参数,它们会修改 PostgreSQL 与该关系交互的方式,例如 fillfactor,它决定了为将来的更新在表的页面上留出多少空间,或者定义自定义的 autovacuum 设置。
一些(但不是全部)存储参数会映射到一个相应的 GUC,这使得 GUC 可以应用于具有自定义值的单个关系。
存储参数是在 PostgreSQL 8.2 中引入的。
表存储参数及引入版本
| 参数 | 始于 |
|---|---|
autovacuum_enabled, toast.autovacuum_enabled |
8.4 |
autovacuum_analyze_scale_factor |
8.4 |
autovacuum_analyze_threshold |
8.4 |
autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age |
8.4 |
autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age |
8.4 |
autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age |
8.4 |
autovacuum_multixact_freeze_min_age, toast.autovacuum_multixact_freeze_min_age |
9.3 |
autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age |
9.3 |
autovacuum_multixact_freeze_table_age, toast.autovacuum_multixact_freeze_table_age |
9.3 |
autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay |
8.4 |
autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit |
8.4 |
autovacuum_vacuum_insert_scale_factor, toast.autovacuum_vacuum_insert_scale_factor |
13 |
autovacuum_vacuum_insert_threshold, toast.autovacuum_vacuum_insert_threshold |
13 |
autovacuum_vacuum_max_threshold, toast.autovacuum_vacuum_max_threshold |
18 |
autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor |
8.4 |
autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold |
8.4 |
fillfactor |
8.2 |
log_autovacuum_min_duration, toast.log_autovacuum_min_duration |
9.2 |
parallel_workers |
9.6 |
toast_tuple_target |
11 |
user_catalog_table |
9.4 |
vacuum_index_cleanup, toast.vacuum_index_cleanup |
12 |
vacuum_max_eager_freeze_failure_rate, toast.vacuum_max_eager_freeze_failure_rate |
18 |
vacuum_truncate, toast.vacuum_truncate |
12 |
变更历史
- PostgreSQL 18
vacuum_max_eager_freeze_failure_rate已添加 (commit 052026c9)autovacuum_vacuum_max_threshold已添加 (commit commit|306dc520b9dfd6014613961962a89940a431a069
- PostgreSQL 16
- PostgreSQL 14
- PostgreSQL 13
- PostgreSQL 9.6
- 使用
ALTER TABLE ... SET (fillfactor = ...)可以在SHARE UPDATE EXCLUSIVE锁级别而不是ACCESS EXCLUSIVE锁级别执行 (commit fcb4bfdd) - 使用
ALTER TABLE ... SET (autovacuum* = ...)可以在SHARE UPDATE EXCLUSIVE锁级别而不是ACCESS EXCLUSIVE锁级别执行 (commit 47167b79)
- 使用
- PostgreSQL 9.4
user_catalog_table已添加 (commit 66abc260)
- PostgreSQL 9.2
log_autovacuum_min_duration已添加 (commit 9d3b5024)
- PostgreSQL 8.4
- autovacuum
存储参数已添加,取代了 catalog tablepg_autovacuum(commit 834a6da4)
- autovacuum
- PostgreSQL 8.2
- 已添加 (初始 commit 277807bd)
示例
创建表时可以设置存储参数,例如:
CREATE TABLE foo (id INT) WITH (fillfactor=75, log_autovacuum_min_duration=10)
并使用例如修改:
ALTER TABLE foo SET (log_autovacuum_min_duration=50)
关系的存储参数记录在其 pg_class 条目中的 reloptions 列(类型为 TEXT[]),并且可以在 psql 中使用 \d+ relname 显示。
postgres=# \d+ foo
Table "public.foo"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+---------+--------------+-------------
id | integer | | | | plain | |
Access method: heap
Options: fillfactor=75, log_autovacuum_min_duration=50
或者直接使用例如检查:
postgres=# SELECT unnest(reloptions) FROM pg_class WHERE oid = 'foo'::REGCLASS; unnest -------------------------------- fillfactor=75 log_autovacuum_min_duration=50 (2 rows)
或者使用函数 pg_options_to_table() (适用于 PostgreSQL 9.1 及更高版本)
postgres=# SELECT option_name, option_value
FROM pg_class c, pg_options_to_table(c.reloptions)
WHERE c.oid = 'foo'::REGCLASS;
option_name | option_value
-----------------------------+--------------
log_autovacuum_min_duration | 50
fillfactor | 75
(2 rows)
参考资料
- PostgreSQL documentation: CREATE TABLE: 存储参数
- PostgreSQL documentation: ALTER TABLE
- PostgreSQL documentation: CREATE INDEX: 存储参数
- PostgreSQL documentation: ALTER INDEX
